【发布时间】:2013-06-24 18:58:51
【问题描述】:
想象一个类(在 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;
}
即重载Invoke,然后回复条件编译,这样如果我实例化
FunctionWrapper<void>,
带有参数的 Invoke 版本永远不会被编译。我确定我在 Modern C++ 设计中读过如何做到这一点,但我不记得细节.....
【问题讨论】:
-
我认为这是使用专业化的完美场景,即使你要求的可以做到,有什么好处?
-
A.我对如何做到这一点很感兴趣,因为我认为这可能是可能的,而且我想知道。 B. 这将节省我为 void 特化定义第二个基本相同的类定义。
标签: c++ templates overloading