我有以下代码(为便于阅读在此简化):

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


什么是正确的方法?

最佳答案

在即将到来的C ++ 17标准之前,不能从构造函数调用中推导出类模板的模板参数。请参见Class template deduction

关于c++ - 模板类特化-如何将template参数传递给构造函数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41312545/

10-11 22:35
查看更多