2016-12-24 197 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