Как я могу получить типы аргументов указателя на функцию в классе шаблона Variadic? - PullRequest
31 голосов
/ 30 января 2012

Это продолжение этой проблемы: Общий функтор для функций с любым списком аргументов

У меня есть класс функторов (полный код см. Ссылку выше):

template<typename... ARGS>
class Foo
{
    std::function<void(ARGS...)> m_f;
  public:
    Foo( std::function<void(ARGS...)> f ) : m_f(f) {}
    void operator()(ARGS... args) const { m_f(args...); }
};

В operator () я могу получить доступ к аргументам ... легко с помощью рекурсивной функции "отслаивания", как описано здесь http://www2.research.att.com/~bs/C++0xFAQ.html#variadic-templates

Моя проблема: я хочу получить доступ к типам аргументов f, то есть ARGS ..., в конструкторе. Очевидно, я не могу получить доступ к значениям, потому что их пока нет, но список типов аргументов как-то скрыт в f, не так ли?

1 Ответ

60 голосов
/ 30 января 2012

Вы можете написать function_traits класс, как показано ниже, чтобы узнать типы аргументов, тип возвращаемого значения и количество аргументов:

template<typename T> 
struct function_traits;  

template<typename R, typename ...Args> 
struct function_traits<std::function<R(Args...)>>
{
    static const size_t nargs = sizeof...(Args);

    typedef R result_type;

    template <size_t i>
    struct arg
    {
        typedef typename std::tuple_element<i, std::tuple<Args...>>::type type;
    };
};

Тестовый код:

struct R{};
struct A{};
struct B{};

int main()
{
   typedef std::function<R(A,B)> fun;

   std::cout << std::is_same<R, function_traits<fun>::result_type>::value << std::endl;
   std::cout << std::is_same<A, function_traits<fun>::arg<0>::type>::value << std::endl;
   std::cout << std::is_same<B, function_traits<fun>::arg<1>::type>::value << std::endl;
} 

Демо: http://ideone.com/YeN29

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...