2010-05-17 53 views
1

Est-il possible d'utiliser des pointeurs de fonction membre avec méta-programmation de modèle? Tels que:Méta-programmation de modèles avec des pointeurs de fonctions membres?

class Connection{ 
public: 
    string getName() const; 
    string getAlias() const; 
//more stuff 
}; 

typedef string (Connection::*Con_Func)() const; 

template<Con_Func _Name> 
class Foo{ 
    Connection m_Connect; 
public: 
    Foo(){ 
     cout << (m_Connect.*_Name)(); 
    } 
}; 

typedef Foo<&Connection::getName> NamedFoo; 
typedef Foo<&Connection::getAlias> AliasFoo; 

Accordé, ceci est plutôt artificiel mais est-ce possible? (oui, il y a probablement beaucoup de meilleurs moyens mais humour moi.)

Répondre

2

Découvrez this discussion sur le sujet des pointeurs-à-non statiques membres en tant que paramètres du modèle. Il semble qu'il y ait des problèmes avec l'implémentation VC++.

+0

Ah, ha! Problèmes avec l'implémentation de VC++! Allez comprendre. – wheaties

2

Si vous demandez, peuvent pointer aux membres peuvent être utilisés comme paramètres de modèle, alors oui ils peuvent. Cependant, il y a un certain nombre d'erreurs dans votre code. Ceci est, je pense, ce que vous pourriez dire:

// Necessary includes 
#include <string> 
#include <iostream> 
#include <ostream> 

class Connection{ 
public: 
     // Use std:: for standard string class 
     std::string getName() const; 
     std::string getAlias() const; 
//more stuff 
}; 

typedef std::string (Connection::*Con_Func)() const; 

template<Con_Func _Name> 
class Foo{ 
    Connection m_Connect; 
public: 
    // Constructors don't have return values 
    Foo(){ 
     // Correct syntax for function call through pointer to member 
     std::cout << (m_Connect.*_Name)(); 
    } 
}; 

typedef Foo<&Connection::getName> NamedFoo; 
typedef Foo<&Connection::getAlias> AliasFoo; 
+0

Vous avez raison. Attends, ce que tu as c'est ce que j'ai dans mon code. J'avais initialement écrit 'void Bar()' mais je revenais sur un constructeur. – wheaties