Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在类模板内指定构造函数模板的整型模板参数_C++_Templates_C++11_Constructor - Fatal编程技术网

C++ 在类模板内指定构造函数模板的整型模板参数

C++ 在类模板内指定构造函数模板的整型模板参数,c++,templates,c++11,constructor,C++,Templates,C++11,Constructor,我正在为联合(而不是结构)创建一个std::tuple等价物。为此,我还添加了一个构造函数模板,其中第一个模板参数是size\t idx,以初始化联合的idxth元素。此外,还有另一个变量模板,用于指定实际类型构造函数的参数 不幸的是,调用构造函数时,我似乎无法指定idxtemplate参数,而且它也不是隐含的(因为它不是参数列表的一部分)。这有什么办法吗?如何指定size\u t构造函数模板参数 示例代码: #包括 模板 结构Foo { T d_val; 尺寸(其他值); 模板 富(T瓦尔)

我正在为
联合
(而不是
结构
)创建一个
std::tuple
等价物。为此,我还添加了一个构造函数模板,其中第一个模板参数是
size\t idx
,以初始化
联合
的idxth元素。此外,还有另一个
变量模板
,用于指定实际类型构造函数的参数

不幸的是,调用构造函数时,我似乎无法指定
idx
template参数,而且它也不是隐含的(因为它不是参数列表的一部分)。这有什么办法吗?如何指定
size\u t
构造函数模板参数

示例代码:

#包括
模板
结构Foo
{
T d_val;
尺寸(其他值);
模板
富(T瓦尔)
{
d_val=val;
d_other_val=idx;
}
};
int main(){
Foo f=Foo(2.6);

std::cout
[temp.arg.explicit]/7
内容如下:

[注意:因为显式模板参数列表跟在函数模板名称后面,而且因为转换 调用成员函数模板和构造函数成员函数模板时不使用 函数名,则无法为这些函数模板提供显式模板参数列表。 -[完注]


因此,您必须将
size\t idx作为常规参数传递,或者将其添加为
struct Foo
的模板参数。

[temp.arg.explicit]/7
内容如下:

[注意:因为显式模板参数列表跟在函数模板名称后面,而且因为转换 调用成员函数模板和构造函数成员函数模板时不使用 函数名,则无法为这些函数模板提供显式模板参数列表。 -[完注]


因此,您必须将
size\t idx
作为常规参数传递,或者将其添加为
struct Foo
的模板参数。

应该为构造函数推导模板参数。“尽管在本例中,这是一个简单的解决方案。”-那么,你能给我们展示一个更好的例子吗?如果参数无法推导,我认为使用模板没有任何意义。@KarolyHorvath我认为这需要相当多的代码,至少,我想不出一个简单的例子。但是,考虑将联合实现为类模板,使用可变模板参数指定联合成员。然后,构造函数模板的size_t template参数用于指定应该初始化哪些联合成员。这可以在运行时完成,但构造函数也需要执行运行时递归,理论上可以在编译时完成。@Herbert:hmm..使用工厂?是的,我现在使用工厂,或多或少,但constructor会更简单:)应该为构造函数推导模板参数。“虽然在本例中,这是一个简单的解决方案。”-那么,你能给我们展示一个更好的例子吗?如果参数无法推导,我认为使用模板没有任何意义。@KarolyHorvath我认为这需要相当多的代码,至少,我想不出一个简单的例子。但是,考虑将联合实现为类模板,使用可变模板参数指定联合成员。然后,构造函数模板的size_t template参数用于指定应该初始化哪些联合成员。这可以在运行时完成,但构造函数也需要执行运行时递归,理论上可以在编译时完成。@Herbert:hmm..使用工厂?是的,我现在使用工厂,或多或少,但constructor会更简单:)要清楚:这不是一个解决方案,只是解释了为什么没有解决方案。我觉得有点遗憾,因为这是一个语法唯一的原因,还是我遗漏了什么?@Herbert是的,它可以被认为是语法唯一的原因:你不能为没有名称的函数指定模板参数。要清楚:这不是一个解决方案,只是解释为什么没有解决方案。我觉得有点遗憾,因为这是一个语法唯一的原因,还是我遗漏了什么?@Herbert是的,这可以被认为是语法唯一的原因:你不能为没有名称的函数指定模板参数。