2011-06-28 4 views
2

J'AVONS avoir petit code ci-dessous:visiteur générique utilisant des modèles variadique

#include <iostream> 
#include <boost/variant.hpp> 
#include <functional> 

struct Test 
{ 
     void one() const { std::cout << "one\n"; } 
     void two(int i) const { std::cout << "two\n"; } 
}; 

struct TestVisitor : public boost::static_visitor<> 
{ 
     template<class ... Args> 
     void operator()(const std::function<void (Args...)>& func) const 
     { 
      //func(args...); 
     } 
}; 

int main() 
{ 
    Test test; 
    std::function<void()> f = std::bind(&Test::one, &test); 

    typedef boost::variant< std::function<void()>, std::function<void (int)> > fvariant; 
    fvariant var = f; 
    boost::apply_visitor(TestVisitor(), var); 

    return 0; 
} 

Ce serait bien d'appeler la fonction objet « Fonction » avec un nombre variable d'arguments (ligne commenté). Connaissez-vous la manière la plus simple de mettre en œuvre cela?

EDIT: TestVisitor est pas définitif. N'hésitez pas à le modifier afin d'appliquer le pack de paramètres de Args ... à std :: function call.

+1

La question posée est un peu pas assez cuite. Si '' func' est une fonction 'vous aurez besoin d'un pack de paramètres' '... args appeler avec. Mais vous n'en avez pas fourni. D'où devraient-ils provenir? – Lambdageek

+0

pack paramètre Args pourrait être appliqué en tant que paramètres du constructeur TestVisitor, ou en tant que paramètres supplémentaires pour fonction opérateur d'appel, ou ... Je suis sûr, ni de quelle manière est une meilleure façon, et comment le faire. – sigidagi

Répondre

0

J'ai posté beaucoup sur sur mon blog, j'ai joué avec lui pendant un jour ou deux, si vous avez besoin de plus, je peux poster mon code: Variadic Template Treatise

Questions connexes