2010-09-15 5 views
0

Je dois prendre une décision dans une instruction BOOST_PP_IF basée sur l'arité (nombre de paramètres) d'un objet boost::function. Est-ce possible?Obtenir boost :: arité de la fonction au moment de la compilation?

boost::function_types::function_arity fait ce que je cherche, mais à l'exécution; J'en ai besoin au moment de la compilation.

+1

Le préprocesseur n'a pas de concept de types ou de valeurs, à l'exception des entiers . Il n'a aucune idée de ce qu'est une fonction. – GManNickG

+0

Seuls les modèles vous donnent une branche de compilation, pas le préprocesseur qui s'exécute comme une étape distincte avant la compilation. –

Répondre

1

Pour une raison quelconque mon comprend continuer à briser mais pas dans l'aperçu = [

#include <ostream> 
#include <iostream> 
#include <boost/function.hpp> 

// Assume that you want to print out "Function is N-arity" for general case. But "nularity" for 0 

template< int i > 
struct DarkSide 
{ 
template<class U> 
void operator()(std::ostream& out, const U& u) { out << "Function is "<<i<<"-arity"<<u; } 
void operator()(std::ostream& out, std::ostream& (*pf)(std::ostream&)) { out << "Function is "<<i<<"-arity"<<pf; } 
}; 

template<> 
struct DarkSide<0> 
{ 
template<class U> 
void operator()(std::ostream& out, const U& u) { out << "Function is nularity"<<u; } 
void operator()(std::ostream& out, std::ostream& (*pf)(std::ostream&)) { out << "Function is nularity"<<pf; } 
}; 

int main() { 
typedef boost::function< void () > vFv; 
typedef boost::function< void (int x) > vFi; 
DarkSide<vFv::arity>()(std::cout,"\n"); 
DarkSide<vFi::arity>()(std::cout,std::endl); 
} 
+0

Cela résout parfaitement mon problème. Merci! – Xtapolapocetl

2
function_arity 

template<typename F> 
struct function_arity; 

Header 

#include <boost/function_types/function_arity.hpp> 

F 

    Callable builtin type 
function_arity<F> 

    Function arity as MPL - Integral Constant 
function_arity<F>::value 

    Constant value of the function arity 

note, c'est la compilation constante

vous devriez commencer ici: http://www.boost.org/doc/libs/1_43_0/libs/mpl/doc/index.html

ou utiliser BOOST_PP_SEQ_FOR_EACH/BOOST_PP_REPEAT_FROM_TO pour générer si/conditions d'autre contre function_arity<F>::value

-1

Si tout ce que vous avez besoin est de lire l'arité d'un coup de pouce fonction :: vous n'avez pas besoin de faire beaucoup de travail:

#include <boost/function.hpp> 
#include <iostream> 
int main() { 
    std::cout << boost::function<void()>::arity << std::endl; 
    std::cout << boost::function<void(int)>::arity << std::endl; 
    std::cout << boost::function<void(int, int)>::arity << std::endl; 
} 
+0

Cela ne permet pas d'obtenir l'arité d'une fonction au moment de la compilation, selon les exigences. – Joel

Questions connexes