【发布时间】:2015-05-05 05:08:29
【问题描述】:
我正在为union(而不是struct)创建一个等效的std::tuple。为此,我还添加了一个构造函数模板,其中第一个模板参数是 size_t idx,以初始化 union 的 idxth 元素。此外,还有另一个variadic template 来指定实际类型构造函数的参数是什么。
不幸的是,在调用构造函数时,我似乎无法指定 idx 模板参数,而且它也不是隐含的(因为它不是参数列表的一部分)。有没有办法解决?如何指定 size_t 构造函数模板参数?
示例代码:
#include <iostream>
template<typename T>
struct Foo
{
T d_val;
size_t d_other_val;
template<size_t idx>
Foo(T val)
{
d_val = val;
d_other_val = idx;
}
};
int main() {
Foo<double> f = Foo<4>(2.6);
std::cout << f.d_val << " " << f.d_other_val << '\n';
}
当然,4 匹配的是类模板,而不是构造函数模板。这是可以修复的吗?请注意, idx 应该是编译时的东西,而不是普通的构造函数参数。尽管在本例中,这只是简单的解决方案。
PS:问题当然是,构造函数模板通常隐含在调用构造函数的参数中。据我所知,隐式规范对于 idx 模板参数是不可能的。
【问题讨论】:
-
模板参数应该为构造函数推导出来。
-
“虽然在这个例子中,这将是微不足道的解决方案。” - 那么,你能给我们举一个更好的例子吗?如果不能推导出参数,我看不出使用模板的意义。
-
@KarolyHorvath 我认为这需要相当多的代码,至少,我想不出一个简单的例子。但是,考虑将联合实现为类模板,并使用可变参数模板参数指定联合成员。然后,构造函数模板的 size_t 模板参数用于指定应该初始化这些联合成员中的哪些。这可以在运行时完成,但是构造函数也需要进行运行时递归,理论上可以在编译时完成。
-
@Herbert: 嗯.. 使用工厂?
-
是的,我现在或多或少正在使用工厂,但构造函数会更简单:)
标签: c++ templates c++11 constructor