8

関数のパラメーターのリストを表す可変個引数テンプレートがあります。

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" 部分だけを抽出する方法はありますか?

注: 可変個引数テンプレート メソッドを使用する必要があります。これは、テンプレート内で各引数の型に対して順番に処理を実行するためです。

4

2 に答える 2

14

以下が機能するはずです。

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;
于 2013-09-18T11:35:24.240 に答える
8

クラス テンプレートではなく関数テンプレートを使用する代替案 ( Daniel Freyソリューションからアイデアを借りる) を次に示します。

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 Daniel Frey's :

私はタイピングを節約します。彼はより慣用的です。実際、C++ メタプログラミングでは、型を取り、型を返す「関数」(またはメタ関数) は、(一般に) メンバーtypeが戻り値を返すテンプレート クラスとして実装されます。このため、私は彼の解決策を好みます。

于 2013-09-18T12:15:47.560 に答える