2010-01-29 6 views
6

Funciona muy bien, para funciones simples de vanilla. El siguiente código funciona bien. Imprime sólo lo es debería:Use Boost para obtener los tipos de arity y paramerter de la función de miembro. (boost :: function_traits)

int __cdecl(int, char) 
2 
int,char 

#include <boost/type_traits.hpp> 
#include <boost/function.hpp> 
#include <boost/typeof/std/utility.hpp> 

#include <iostream> 

using std::cout; 
using std::endl; 

int foo(int, char) { 
return 0; 
} 
int main() { 
    typedef BOOST_TYPEOF(foo) foo_type;; 
    typedef boost::function_traits<foo_type> function_traits; 

    cout << typeid(foo_type).name() << endl; 
    cout << function_traits::arity << endl; 
    cout << typeid(function_traits::arg1_type).name() << ","; 
    cout << typeid(function_traits::arg2_type).name() << endl; 

    return 0; 
} 

Por lo tanto, la pregunta es, ¿cómo se puede hacer esto si foo es una función miembro de la barra de clase?

struct bar { 
    int foo(int, char) { return 0; } 
}; 

me han tratado innumerables combinaciones de estas construcciones: BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP() BOOST_TYPEOF_REGISTER_TYPE() :: impulso impulso ref :: remove_pointer impulso impulso :: bind :: mem_fn

etc, etc ... No se alegría.

Respuesta

8

Boost Function Types probablemente sería la solución natural:

#include <boost/function_types/function_type.hpp> 
#include <boost/function_types/parameter_types.hpp> 
#include <boost/function_types/function_arity.hpp> 
#include <boost/typeof/std/utility.hpp> 
#include <iostream> 

struct bar { 
    int foo(int, char) { return 0; } 
}; 

int main() { 

    typedef BOOST_TYPEOF(&bar::foo) foo_type; 

    std::cout << typeid(foo_type).name() << std::endl; 
    std::cout << boost::function_types::function_arity<foo_type>::value << std::endl; 
    std::cout << typeid(boost::mpl::at_c<boost::function_types::parameter_types<foo_type>,1>::type).name() << ","; 
    std::cout << typeid(boost::mpl::at_c<boost::function_types::parameter_types<foo_type>,2>::type).name() << ","; 

    return 0; 
} 
+0

Créanme, he probado todas las variantes usando BOOST_TYPEOF (& bar :: foo) que se me ocurren. Espero que alguien pueda publicar un programa pequeño y funcional, como el de la pregunta. –

+0

La mayoría de las personas lo hacen. He sido programador profesional desde 1971, y aprendí que no tiene sentido enunciar las cosas. Gracias por tu ayuda. –

+0

@Jive, no hay problema, de todos modos no obtengo nada, aunque esto me dio la inclinación de intentar hacer esa cosa completa de la biblioteca de reflexión C++ de nuevo;> –

1

Kornel Kisielewicz clavó. Aquí está con la solución separada de los mensajes de prueba.

#include <boost/function_types/function_type.hpp> 
#include <boost/function_types/parameter_types.hpp> 
#include <boost/function_types/function_arity.hpp> 
#include <boost/typeof/std/utility.hpp> 
#include <iostream> 

struct bar { 
    int foo(int, char) { return 0; } 
}; 

int main() { 

    typedef BOOST_TYPEOF(&bar::foo) 
     foo_type; 
    int arity = boost::function_types::function_arity<foo_type>::value; 
    typedef boost::mpl::at_c<boost::function_types::parameter_types<foo_type>,1>::type 
     arg1; 
    typedef boost::mpl::at_c<boost::function_types::parameter_types<foo_type>,2>::type 
     arg2; 

    std::cout << typeid(foo_type).name() << std::endl; 
    std::cout << arity << std::endl; 
    std::cout << typeid(arg1).name() << ","; 
    std::cout << typeid(arg2).name() << std::endl; 
    return 0; 
} 
+1

interesante y útil. por cierto necesita '#include ' – groovehunter

Cuestiones relacionadas