想象一個類(在VS2010,沒有可變參數模板這裏對不起)條件編譯
template <class Arg>
class FunctionWrapper
{
public:
void Invoke(Arg arg){_fn(arg)};
private:
std::function<void(Arg)> _fn;
}
然後我就可以做如
FunctionWrapper <int> foo; foo.Invoke(4);
而且這個編譯好。但這並不:
FunctionWrapper <void> foo; foo.Invoke();
現在,我可以解決這個使用模板特殊化。但我也想知道是否有一個辦法可以解決這個問題的另一種方式....
template <class Arg>
class FunctionWrapper
{
public:
void Invoke(void){_fn()}; // } overloaded
void Invoke(Arg arg){_fn(arg)}; // }
private:
std::function<void(Arg)> _fn;
}
即超載調用,然後在條件編譯答覆,這樣,如果我實例 FunctionWrapper<void>
, 調用的版本與參數永遠不會被編譯。我確定我在Modern C++設計中讀到了如何做到這一點,但我不記得細節.....
我認爲這是使用專業化的完美場景,即使你問的問題可以做,有什麼好處? –
答:我對如何做到這一點感興趣,因爲我認爲這可能是可能的,而且我想知道。 B,它可以節省我爲虛空專業定義第二個,大體上相同的類定義。 –