我有用于存储回调函数的结构:
template<class T>
struct CommandGlobal : CommandBase
{
typedef boost::function<T ()> Command;
Command comm;
virtual T Execute() const
{
if(comm)
return comm();
return NULL;
}
};
似乎应该可以正常工作,除非T为空,因为Execute函数想要返回一个值..
这个问题的最佳解决方案是什么?
谢谢!
答案 0 :(得分:13)
此答案基于this fun-fact:在返回void
的函数中,您可以返回任何类型为void的表达式。
所以简单的解决方案是:
virtual T Execute() const
{
if (comm)
return comm();
else
return static_cast<T>(NULL);
}
当T = void
时,最后一个return语句等同于return;
。
然而,我觉得这是糟糕的设计。 每个 NULL
的{{1}}是否有意义?我不这么认为。我会抛出异常:
T
但是,这是automatically by Boost完成的,因此您的代码变得更加清晰:
virtual T Execute() const
{
if (comm)
return comm();
else
throw std::runtime_error("No function!")
}
然后,您可以添加其他功能,例如:
virtual T Execute() const
{
return comm();
}
因此用户可以在调用之前检查是否可以调用它。当然,在这一点上,除非你的课程有其他功能你为了这个问题而遗漏了,我认为没有理由不首先使用bool empty(void) const
{
return !comm; // or return comm.empty() if you're the explicit type
}
。
答案 1 :(得分:4)
如果只是return
语句,这应该可以解决问题:
virtual T Execute() const
{
if(comm)
return comm();
return T();
}
如果有更多内容,请专门设定void
的模板。