我有以下代码(在这里简化了可读性):上述模板类专精 - 如何将模板参数传递给构造函数?
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在哪里可能工作。见[建议P0091R3](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0091r3.html) –
'class_name obj_q(rand()> 42?B:C,5 );'// obj_q是什么类型,'class_name '或'class_name'? –
cpplearner
你可能会引入类似'#define ClassName(ID,N)class_name()'的类似于你的期望语法,但用<<>'的语法对我来说更清晰(据我所知,参数应该是constexpr)。 –
Jarod42