【问题标题】:most elegant variadic functor最优雅的可变参数函子
【发布时间】:2014-01-17 00:02:00
【问题描述】:

假设我们有两种类

  • 输入类Input
    • 定义一个类型result_type
    • 定义set(result_type)
  • 一个输出类Output
    • 定义一个类型result_type
    • 定义result_type get() const
    • 有许多 Input 类作为成员变量,其输出依赖于这些变量

给定一个输出类和几个输入类(任意数),考虑以下过程:

  • 循环遍历每个输入类并使用适当的值(预先定义)调用set()
  • 在输出类上调用get() 并收集结果。

这个过程可以看作是对一个函数的调用,该函数将输入值作为参数并返回输出值。

编写在一般情况下构造这样一个可变参数函数的函子。

约束是:C++(很可能是 C++11)、任意数量的可能不同 Input::result_types 的输入类。请注意,Input::result_type 不一定与Output::result_type 相关。目标首先应该是效率,但如果代码优雅易读,会有很大的好处。

详情:对于那些想知道OutputInput 有何关系的人,可以想象Input 也有一个result_type get() const 方法,它返回您通过@ 提供的任何内容987654337@。 Output 然后有一个构造函数,它接受各种Inputs,并将它们(或它们的引用)存储为成员变量。 Output::get() 然后通过使用其输入的get() 方法的返回值进行一些数学运算,并返回一些Output::result_type 类型的结果。

【问题讨论】:

    标签: c++ c++11 functor variadic-functions


    【解决方案1】:

    这是我的解决方案,欢迎其他人

    #include <functional>
    
    template <class Output, class... Inputs>
    std::function<typename Output::result_type(typename Inputs::result_type...)>
    make_function(const Output& output, Inputs&... inputs) {
      return[&](typename Inputs::result_type... input_vals) {
        int dummy[]{0, (inputs.set(input_vals),0)...};
        return output.get();
      };
    }
    

    int dummy[] 行是由于 @ecatmur (https://stackoverflow.com/a/12515637/958110)

    【讨论】:

    • 我并不羞于承认我完全迷失了输出类在执行之前如何接收成员初始化的输入实例并建立最终的@987654324 @。我看到了虚拟数组中输入的扩展,但它们与output 没有任何关系,因为outputconst,所以它们也不可能存在。也就是说,这个问题仍然很有趣。但请注意,请求是“写函子”;你写了一个函数
    • 我将在描述此链接的问题中添加评论。对我来说,仿函数是一个函数,例如一个更高级别的函数,一个在函数空间上工作的函数。我可能错了。
    • @yannick:其他领域还有其他含义。但是,在 C++ 中,函子严格来说是一个实现了operator()() 的对象,因此它可以像函数一样嘎嘎作响。
    猜你喜欢
    • 2012-08-26
    • 2021-03-15
    • 1970-01-01
    • 2021-12-19
    • 1970-01-01
    • 2012-12-19
    • 1970-01-01
    • 2014-10-04
    • 2014-09-17
    相关资源
    最近更新 更多