C++ C++;具有不同类型的非类型参数的可变模板

C++ C++;具有不同类型的非类型参数的可变模板,c++,templates,c++11,variadic-templates,C++,Templates,C++11,Variadic Templates,我想定义一个类,它接受非类型参数的列表,可能是不同类型的参数。例如,以下内容应有效: Test<3, 4.5, 6> t; 更具体地说,在我的特定用例中,有第二个类Base,它有许多成员,我想传递Base成员指针 Test<&Base::a, &Base::b> 我如何定义这样一个类测试?您可以通过以下方式进行: template <class... Types> struct Wrapper { template <Type

我想定义一个类,它接受非类型参数的列表,可能是不同类型的参数。例如,以下内容应有效:

Test<3, 4.5, 6> t;
更具体地说,在我的特定用例中,有第二个类
Base
,它有许多成员,我想传递
Base
成员指针

Test<&Base::a, &Base::b>

我如何定义这样一个类
测试

您可以通过以下方式进行:

template <class... Types>
struct Wrapper
{
    template <Types... args>
    class Test {
        // ...
    };
};
类似地,可以实现指向成员的指针的更具体情况:

struct Base
{
    int a;
    float b;
    void c() {}
};

template <class... Types>
struct Wrapper
{
    template <Types Base::*... args>
    class Test {
        //
    };
};
struct Base
{
INTA;
浮球b;
void c(){}
};
模板
结构包装器
{
模板
课堂测试{
//
};
};
使用的示例:

Wrapper<int, float, void ()>::Test<&Base::a, &Base::b, &Base::c> t2;
Wrapper::testt2;

使用变量宏和
decltype

关键字可以缩短此符号。

那么问题到底是什么?我认为最好使用
std::integral\u constant
或类似的方法,并使用一组类型模板参数。然后,您可以使用宏来简化样板文件,例如:
\define C#u MEM_FUN(X)std::integral_constant
,然后
Test
我认为
template
应该是
template
。您能详细说明一下关于
decltype
的评论吗?如果我可以在
Wrapper
之后删除类型列表,那就太理想了,因为它们是冗余的。我知道的最简单的方法是使用
std::make_tuple
的样式-使用依赖于参数的查找来推断类型。有了这个,我读到, MaxuPuple < /C>可能不会太长,这与C++的约定是对立的。您可能希望
模板X(T&&…
的构造函数参数推断出
X
,但是ADL必须从它自己的构造函数中查找类型,其中在实例化类型之前存在该构造函数。你需要一个通用的选择和/或一种方法来指定要从中推断的构造函数-所有这些都可能在工作中。我个人希望
friend
构造函数是语法。我试着创建一个
friend
工厂,但当我意识到我的实现正朝着使用
std::integral_constant
s的方向发展时,我突然停了下来,如果std库的作者使用他们所使用的模板签名,这可能会很棘手。
Wrapper<int, char, unsigned>::Test<1, '2', 3U> t;
struct Base
{
    int a;
    float b;
    void c() {}
};

template <class... Types>
struct Wrapper
{
    template <Types Base::*... args>
    class Test {
        //
    };
};
Wrapper<int, float, void ()>::Test<&Base::a, &Base::b, &Base::c> t2;