想象一个类(在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>
,带有参数的调用版本永远不会被编译。我确定我读过如何在现代 C++ 设计中做到这一点,但我不记得细节.....