在编写一个函数模板时,它应返回传递的函数返回的内容 - 如何避免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
。)
答案 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);
}