我正在为std::tuple
(而非union
)创建struct
个等效项。为此,我还添加了一个构造函数模板,其中第一个模板参数为size_t idx
,以启动union
的idx th 元素。此外,还有另一个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模板参数是不可能的。
答案 0 :(得分:4)
[temp.arg.explicit]/7
读到:
[注意:因为显式模板参数列表遵循函数模板名称,因为转换 不使用a调用成员函数模板和构造函数成员函数模板 函数名称,无法为这些函数模板提供显式模板参数列表。 -end note ]
因此,您必须将size_t idx
作为常规参数传递,或将其添加为struct Foo
的模板参数。