【问题标题】:Std function with unknown return type具有未知返回类型的标准函数
【发布时间】:2017-01-30 14:50:57
【问题描述】:

我试图在不直接知道返回类型的情况下声明一个 std 函数。

显然,它会在编译时知道,但我找不到正确的方法来声明它。

最重要的是,我需要创建一个容器,该容器将包含此函数返回的值。

template <typename... Args>
class Sample
{
public:
    Sample(Args... args, std::function</*unknown return type*/(Args...)> fnct) :
        _inputBuff(std::forward_as_tuple(std::forward<Args>(args)...))

    { }

    std::tuple<Args...>                     _inputBuff;
    std::vector</*unknown return type*/>    _resultBuff;

};

有什么想法吗?

【问题讨论】:

  • 何时知道,如何知道?
  • @LightnessRacesinOrbit 我正在尝试找到一种优雅的方式来做到这一点,但是,是的,这是一个选择。
  • @Wimps:看起来很简单的问题,不是吗?
  • @Jarod42 我什么时候调用构造函数
  • @Wimps:这没有任何意义。您调用 type 的构造函数。在定义类型之前,您没有类型。因此,您不能基于类型的构造函数调用来定义类型。

标签: c++ std-function


【解决方案1】:

您也不知道函数参数,并使用模板参数解决了这个问题(嗯,参数包,因为有零个或多个)。

对返回类型做同样的事情!

template <typename ReturnType, typename... Args>
class Sample
{
public:
    Sample(Args... args, std::function<ReturnType(Args...)> fnct) :
        _inputBuff(std::forward_as_tuple(args...))

    { }

    std::tuple<Args...>     _inputBuff;
    std::vector<ReturnType> _resultBuff;
};

(live demo)

【讨论】:

  • 我同意,没有其他选择。谢谢!
  • @Wimps:不知道你为什么要找。您认为这种传统方法存在问题吗?
  • 我想找到一种方法来声明我的函数和容器,而无需询问用户他需要放入其中的类型
  • @Wimps:所以你真正要问的是如何在调用点进行模板参数推导。
  • @Wimps:不幸的是,这是 C++ 的限制。
【解决方案2】:

您可以在模板参数中接受可调用类型,而不是参数列表。这将允许您发送任何函数或函数对象并检查返回类型:

template<typename F, typename... Args>
struct Sample {
    Sample(F fnct, Args... args) :
        _inputBuff{std::forward_as_tuple(std::forward<Args>(args)...)} { }

    using Result = std::result_of_t<F(Args...)>;

    std::tuple<Args...> _inputBuff;
    std::vector<Result> _resultBuff;
};

为了简化该类的构造,您可以引入一个会推导参数的 make 函数(注意它可以成为 C++17 中的推导指南):

template<typename F, typename... Args>
auto makeSample(F&& fnct, Args&&... args) {
    return Sample<std::decay_t<F>, Args...>{std::forward<F>(f), std::forward<Args>(args)...};
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多