【问题标题】:Can a generic function be used for summing structs?通用函数可以用于对结构求和吗?
【发布时间】:2014-03-06 19:52:39
【问题描述】:

假设我有一个结构体,比如:

struct Foo {
    double a;
    float b;
    int c;
};

fooAfooB(均为Foo 类型)相加将等于:

{fooA.a + fooB.a, 
 fooA.b + fooB.b, 
 fooA.c + fooB.c};

现在我的问题是,是否可以创建一个通用函数,以这种方式将结构汇总在一起?即:

template <typename StructType>
StructType sumStructs(StructType A, StructType B) {
    // sum component with one another, return resulting struct
}

或者,您需要施加哪些限制才能使其成为可能?

【问题讨论】:

  • 不,C++ 没有introspection,因此无法获取未知结构的结构成员。
  • 我认为你不需要自省,这里需要的是编译时反射。这可以通过各种方式实现,但不能使用“香草”C++。 (例如带有代码生成的多阶段构建)。

标签: c++ generics generic-programming


【解决方案1】:

正如 Joachim Pileborg 所说,

不,C++ 没有introspection 所以没有办法获得结构 未知结构的成员。

所以我最终做的是为每个结构单独重载+。这反过来又允许我创建一个通用函数,该函数接受一个节点,并对它的所有父结构求和(例如,用于求和位置,以获得对象的绝对位置)。

【讨论】:

    【解决方案2】:

    是的,你当然可以。您还可以重载 + 运算符并免费获得这种类型的泛型。 c++中有很多这样的想法。 Less&lt;T&gt;beginend 免费功能。

    【讨论】:

    • OP 应该如何获取模板函数/方法中结构的所有字段,而确切的结构类型未知?
    • 您可以直接输入一组结构或提供适配器模板类或重载运算符。 Less 是模板适配器的一个示例。
    • 喜欢,鸭子类型每个可能的字段类型的每个可能的集合?
    • 一般来说,适配器用于不符合要求的类型。类似于少。如果你有一个
    猜你喜欢
    • 2021-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-06
    • 1970-01-01
    • 2022-11-29
    • 2014-08-03
    相关资源
    最近更新 更多