想象一个类(在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,它可以节省我为虚空专业定义第二个,大体上相同的类定义。 –