2011-03-20 38 views
7

這是我如何可以有條件地使類的構造方法:有條件地允許構造

struct Foo 
{ 

    template<class T> 
    Foo(T* ptr, boost::enable_if<is_arithmetic<T> >::type* = NULL) 
    {} 

}; 

我想知道爲什麼我需要通過一個虛擬的參數來完成啓用。爲什麼我不能只是寫:

struct Foo 
{ 
    template<class T> 
    Foo(boost::enable_if<is_arithmetic<T>, T>::type* = NULL) 
    {} 
}; 

回答

8
上的任何其他功能,但構造

可以,因爲這樣你可以修改函數名,包括模板參數。

Foo foo; 
foo.Method<T>(); 

使用構造,不過,構造函數的名字不會出現在你的表達,所以沒有地方明確提出模板參數。你必須從一個參數中推斷出它。

Foo<T> foo; // no good, assumes the type Foo is a template, not its constructor 
Foo* pfoo = new Foo<T>(); // same problem 

Foo foo((T*)0); // ok, deduced 
Foo* pfoo = new Foo((T*)0); // same 
+0

因此,如果我理解正確,問題是要確保模板參數扣除成功。這可以通過使用類型 - foo.Method 明確地實例化模板來完成,或者使Method獲取允許扣除的參數 - 模板 void方法(U * ptr,boost :: enable_if > :: type * = NULL) {} – 2011-03-20 00:22:09

+0

@MK:是的,對於大多數成員函數,您可以選擇。使用構造函數,沒有辦法明確指定模板參數。 – 2011-03-20 00:28:03

+0

@MK:對於其他函數,'enable_if'很好地放在返回值上,以免干擾模板參數推理。唉,構造函數沒有返回類型。 OTOH,沒有人會接受構造函數的地址,因此沒有人會爲這個「隱藏的」額外論證而煩惱。 – UncleBens 2011-03-20 00:56:57

相關問題