Как получить типы аргументов указателя функции в classе вариационных шаблонов?

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

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

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

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

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

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

 template struct function_traits; template struct function_traits> { static const size_t nargs = sizeof...(Args); typedef R result_type; template  struct arg { typedef typename std::tuple_element>::type type; }; }; 

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

 struct R{}; struct A{}; struct B{}; int main() { typedef std::function fun; std::cout << std::is_same::result_type>::value << std::endl; std::cout << std::is_same::arg<0>::type>::value << std::endl; std::cout << std::is_same::arg<1>::type>::value << std::endl; } 

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

Interesting Posts

Как изменить тип идентификатора в Microsoft.AspNet.Identity.EntityFramework.IdentityUser

Шаблон дизайна для Undo Engine

Комплект iPhone Store «Не удается подключиться к iTunes Store»

Автоматически запускать приложение в качестве другого пользователя

Почему работает ITelephony.aidl?

Ускорьте работу цикла в R

Ошибка компилятора: ссылка на вызов неоднозначную

Windows XP зависает при завершении работы в VMWare Fusion

Могу ли я решить эту проблему с помощью чистого mysql? (присоединение к ‘;’ разделенные значения в столбце)

Мне нужен альтернативный вариант для HttpClient в Android для отправки данных на PHP, поскольку он больше не поддерживается

Ошибка DocumentTermMatrix в аргументе Corpus

Почему скорость передачи данных по Fast Ethernet (по 100 Мбит / с, по моему мнению) составляет всего ~ 1,5 Мбайт / с

Как скопировать профиль пользователя Windows 7 при изменении доменов

Как внедрить AuthenticationManager с использованием конфигурации Java в пользовательский фильтр

Динамические имена таблиц в функции хранимой процедуры

Давайте будем гением компьютера.