在类模板中指定构造函数模板的整数模板参数

时间:2015-03-04 09:18:48

标签: c++ templates c++11 constructor

我正在为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';
}

来源:http://ideone.com/UeBvF5

当然,4在类模板上匹配,而不是构造函数模板。这可以解决吗?请注意,idx应该是编译时的事情,而不是普通的构造函数参数。虽然在这个例子中,这将是一个微不足道的解决方案。

PS:问题当然是,通常构造函数模板是由调用构造函数的参数隐含的。据我所知,隐式规范对于idx模板参数是不可能的。

1 个答案:

答案 0 :(得分:4)

[temp.arg.explicit]/7读到:

  

[注意:因为显式模板参数列表遵循函数模板名称,因为转换   不使用a调用成员函数模板和构造函数成员函数模板   函数名称,无法为这些函数模板提供显式模板参数列表。    -end note ]

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