声明一个函数,其中包含从外部参数包中获取的参数类型

Tig*_*uev 5 c++ variadic-templates c++11

假设我有某种类型列表

template<typename... Types> struct TypeList {};
Run Code Online (Sandbox Code Playgroud)

现在在其他一些课程中,我可以通过TypeList各种方式生成这样的课程.

template<class T> struct MyClass {
    using MyList = TypeList<T, typename Something<T>::type, SomethingElse>;
    // ...
};
Run Code Online (Sandbox Code Playgroud)

如何声明一个方法,其中包含从此类型列表中提取的参数类型?例如,如果我设置MyList = TypeList<int, float, const char*>,我希望一个方法

void my_method(int, float, const char*)
Run Code Online (Sandbox Code Playgroud)

被宣布.

Ker*_* SB 4

您可以从实现该方法的基类派生:

template <typename> struct MethodProvider;

template <typename ...Args>
struct MethodProvider<TypeList<Args...>>
{
    void my_method(Args ...args);
};

template <typename T>
struct MyClassAux
{
    using MyList = TypeList<T, typename Something<T>::type, SomethingElse>;
};

template <typename T>
struct MyClass
    : private MyClassAux<T>
    , private MethodProvider<typename MyClassAux<T>::MyList>
{
    using typename MyClassAux<T>::MyList;
    using MethodProvider<typename MyClassAux<T>::MyList>::my_method;

    // ...
};
Run Code Online (Sandbox Code Playgroud)