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;