模板类专门化 - 如何将模板参数传递给构造函数?

时间:2016-12-24 10:42:47

标签: c++ c++11 templates template-specialization

我有以下代码(此处为简化了可读性而简化):

enum id_t {B, C, D};

template <id_t id, int16_t value> class class_name;

template <int16_t value>
class class_name<B, value>
{ 
public:
    void member_func() { /* do something related to B */ }
};

template <int16_t value>
class class_name<C, value>
{ 
public:
    void member_func() { /* do something related to C */ }
};

template <int16_t value>
class class_name<D, value>
{ 
public:
    void member_func() { /* do something related to D */ }
};

上面的代码运行正常。我做了这样的事情,没关系:

class_name<B, 5> obj_b;
class_name<C, 3> obj_c;
class_name<D, 1> obj_d;

obj_b.member_func();
obj_c.member_func();
obj_d.member_func();

我还需要将class_name实例化为函数的参数,尽管语法难以理解,但它仍然有效:

do_something_with_class_name_objs(class_name<D, 0>(), class_name<C, 2>());

因为我希望事情尽可能简单,让其他人使用,我试图隐含模板参数,就像我们用参数调用函数模板时那样,编译器知道如何实例化函数只是查看函数参数,而不是模板参数。

我想以这种方式实例化我的class_name:

class_name obj_b(B, 5);
class_name obj_c(C, 3);
class_name obj_d(D, 1);

所以我可以通过这种方式将它实例化为函数的参数:

do_something_with_class_name_objs(class_name(D, 0), class_name(C, 2));

它更具可读性,恕我直言。

我试图在某些方面改变我的模板专精。以下模板中的构造函数都不起作用:

template <int16_t value>
class class_name<B, value>
{ 
public:
    class_name(id_t id, int16_t value) {}           // don't work
    class_name(B, value) {}                         // don't work
    class_name<B, value>(id_t id, int16_t value) {} // don't work  
    void member_func() { /* do something related to B */ }
}; 

这样做的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

类模板的模板参数不能从构造函数调用推断出......直到即将推出的C ++ 17标准。请参阅Class template deduction