Извлеките только список типов аргументов из decltype (someFunction)

У меня есть вариативный шаблон, который представляет собой список параметров функции, например:

void myFunc (int,int,std::string) { }
template<typename... Args> class MyTemplateClass { };
...
MyTemplateClass<int,int,std::string> myConcrete; // for use with myFunc later

Есть ли способ извлечь только типы аргументов из decltype (func), чтобы не писать их вручную, например:

MyTemplateClass<something_like_decltype(myFunc)> myConcrete;

т.е. decltype в этом случае даст мне «void (int, int, string)», но есть ли способ извлечь только часть «int, int, string» для использования в вариационном шаблоне?

Примечание. Я должен использовать метод вариативного шаблона, потому что в шаблоне он по очереди выполняет обработку каждого типа аргумента.


person gimmeamilk    schedule 18.09.2013    source источник


Ответы (2)


Следующее должно работать:

template<template<typename...> class C,typename T>
struct apply_args;

template<template<typename...> class C,typename R,typename... Args>
struct apply_args<C, R(Args...) >
{
    typedef C<Args...> type;
};

typedef apply_args<MyTemplateClass,decltype(myFunc)>::type MyConcrete;
MyConcrete myConcrete;
person Daniel Frey    schedule 18.09.2013

Вот альтернатива (заимствование идей от Дэниела Фрея решение) с использованием шаблона функции, а не шаблона класса:

template <template<typename...> class C, typename R, typename... Args>
C<Args...> apply_args(R(Args...));

void f(int, bool);

using MyPair = decltype(apply_args<std::pair>(f)); // = std::pair<int, bool>
MyPair myPair{42, false};

Изменить: комментарии к моему решению x Дэниела Фрея:

Моя экономит набор текста. Его более идиоматичный. В самом деле, в C ++ метапрограммирование «функции» (или мета-функции), которая принимает типы и возвращает тип, (обычно) реализовано как класс шаблона, член type которого дает результат. По этой причине я предпочитаю его решение.

person Cassio Neri    schedule 18.09.2013