2013-04-02 1 views
2
Templated

J'ai le code qui ressemble àfonction en tant que paramètre

template<typename C> 
void invoke() { 
    if (thing_known_at_runtime) { 
    C::template run<int>(4); 
    } else { 
    C::template run<char>('a'); 
    } 
} 

struct output { 
    template<typename T> 
    static void run(T x) { 
    cout << x; 
    } 
}; 

invoke<output>(); 

Et cela fonctionne.

Mais je n'aime pas la définition du poids lourd de sortie. Je voudrais pouvoir écrire:

template<typename T> 
void output(T x) { 
    cout << x; 
} 

Et puis appelez soit appeler < sortie>() ou appeler (sortie). Existe-t-il un moyen de définir invoke pour que cela fonctionne?

(la production et invoquer sont plus compliquées - ceci est une version simplifiée pour poser la question avec Non, des solutions qui impliquent sachant int quand je l'appelle Invoke ne sont pas utiles..)

+2

est-11 C++ permis? Et ai-je bien compris que vous voulez juste appeler une fonction avec des arguments stockés? – chris

+0

Comment std :: function peut-il m'aider? Oui, C++ 11 est autorisé. Je souhaite appeler une fonction avec des arguments stockés (calculés) * et des paramètres de modèle *. En fait, laissez-moi éditer l'exemple pour le rendre clair. – dspeyer

+0

N'êtes-vous pas prêt à définir deux versions de 'invoke()'? – jxh

Répondre

0

Vous ne pouvez pas faire une telle chose . Vous devez savoir, ce que vous voulez faire, AVANT d'appeler au invoke. Quelque chose comme ça va bien travailler

void invoke(const std::function<void()>& func) 
{ 
    func(); 
} 

template<typename T> 
void output (const T& val) 
{ 
    std::cout << val << std::endl; 
} 

if (rand() % 2) 
{ 
    invoke(std::bind<void(&)(const int&)>(&output, globals::value_calculated)); 
} 
else 
{ 
    invoke(std::bind<void(&)(const char&)>(&output, globals::value)); 
} 

Exemple complet sur lws: http://liveworkspace.org/code/1uLIr4 $ 0

Questions connexes