我有以下代码(此处为简化了可读性而简化):
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 */ }
};
这样做的正确方法是什么?