我有以下代碼(在這裏簡化了可讀性):上述模板類專精 - 如何將模板參數傳遞給構造函數?
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