避免函数的`void`返回类型的特殊情况

时间:2015-02-24 11:06:11

标签: c++

在编写一个函数模板时,它应返回传递的函数返回的内容 - 如何避免return语句不能与返回void的函数一起使用?

示例:

struct FunctionalVoid {
    typedef void result_type;
    result_type foo () const { return; }
};

struct FunctionalInt {
    typedef int result_type;
    result_type foo () const { return 42; }
};

template< class F >
typename F::result_type
g (const F & f) {
   return f.foo ();
}

现在我可以写g (FunctionalInt {});,但我不能写g (FunctionalVoid {});。如果不编写g两次,有没有办法解决这个问题?

(真正的g当然是一个更复杂的功能。)

(编辑:减少愚蠢 - 成员函数名为foo而不是do。)

1 个答案:

答案 0 :(得分:6)

您不需要!

return void() 有效(在返回void的函数中),正好允许这样做。

允许做的是命名一个函数do,因为这是一个关键字。

因此,当我将do重命名为foo并添加以下main函数时,the only diagnostics emitted by my compiler are warnings about an unused variable

int main()
{
    FunctionalVoid obj1;
    g(obj1);

    FunctionalInt obj2;
    int result2 = g(obj2);
}