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

template class specialization - how to pass the template argument to constructor?

我有以下代码(为了便于阅读而在此处进行了简化):

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));

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

我尝试以某些方式更改我的模板专业化。 None 以下模板中的构造函数有效:

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 */ }
}; 

正确的做法是什么?

class 模板的模板参数无法从构造函数调用中推导出来...直到即将推出的 C++17 标准。参见 Class template deduction