下面的代码将参数包转发给某个用户定义的可调用对象(在本例中为函数指针)。在C ++ 11中是否有办法返回可调用的返回值?更具体地说,我希望能够推导出raise()的返回类型,以便我可以为它添加一个return语句。我意识到我可以添加一个返回类型模板参数,但是我们还不知道模板参数Func中的返回类型吗?
size_t example(const std::string& str)
{
return str.size();
}
template <class Func>
class signal
{
public:
signal()
{
}
~signal()
{
}
void attach(Func handler)
{
_handler = handler;
}
template <typename... T>
void raise(T&&... args)
{
auto val = _handler(std::forward<T>(args)...);
// How do I return this?
}
private:
Func _handler;
};
typedef size_t(*fcn)(const std::string&);
int main()
{
signal<fcn> sig;
sig.attach(&example);
sig.raise("hello!");
return 0;
}
答案 0 :(得分:4)
这是decltype
的目的。
template <typename... T>
auto raise(T&&... args) ->
decltype(std::declval<Func&>()(std::forward<T>(args)...))
{
return _handler(std::forward<T>(args)...);
}
decltype(expr)
提供expr
的类型。请注意,您需要args
:Func
可能是一个带有多个重载operator()
函数且具有不同返回类型的仿函数对象,您需要参数类型来确定使用哪个重载。