gpt4 book ai didi

c++ - 转发通用可调用对象的返回值

转载 作者:行者123 更新时间:2023-11-27 22:46:27 25 4
gpt4 key购买 nike

下面的代码将参数包转发给某个用户定义的可调用对象(在本例中为函数指针)。 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;
}

最佳答案

这就是 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() 函数的仿函数对象,您会需要参数类型来确定使用哪个重载。

关于c++ - 转发通用可调用对象的返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42338008/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com