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

时间:2017-02-20 06:41:20

标签: c++ c++11

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

1 个答案:

答案 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的类型。请注意,您需要argsFunc可能是一个带有多个重载operator()函数且具有不同返回类型的仿函数对象,您需要参数类型来确定使用哪个重载。