使用模板返回值。如何处理无效返回?

时间:2010-07-22 04:58:09

标签: c++ templates callback

我有用于存储回调函数的结构:

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函数想要返回一个值..

这个问题的最佳解决方案是什么?

谢谢!

2 个答案:

答案 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的模板。