2016-12-24 154 views
0

我有以下代码(在这里简化了可读性):上述模板类专精 - 如何将模板参数传递给构造函数?

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

什么是正确的方法来做到这一点?

+0

你最好的选择是等待C++ 17在哪里可能工作。见[建议P0091R3](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0091r3.html) –

+1

'class_name obj_q(rand()> 42?B:C,5 );'// obj_q是什么类型,'class_name '或'class_name '? – cpplearner

+0

你可能会引入类似'#define ClassName(ID,N)class_name ()'的类似于你的期望语法,但用<<>'的语法对我来说更清晰(据我所知,参数应该是constexpr)。 – Jarod42

回答

2

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

+1

无论如何,在目前的情况下,模板参数扣除都无济于事。 – Jarod42