如何在C语言中创建一个接口,使其可以处理两个具有不同名称字段的相同结构

zyfwsgd6  于 2022-12-22  发布在  其他
关注(0)|答案(1)|浏览(163)

问题背景

考虑这样一个场景,我有两个结构体。两个结构体都由三个字段组成。唯一的区别是用于引用这些字段的名称。第一个结构体用于无描述的元组,其组件命名为x、y和z。第二个结构体用于RGB值,其组件命名为red、绿色、这两个结构体都需要定义一个接口,以便执行向量/分量加法和标量乘法等操作。

问题

问题是,仅仅为了改变命名方案而复制和粘贴这两个结构体的相同代码,(X对红色,Y对绿色,z vs. blue)。**理想情况下,可以在接口函数定义中引用结构体的字段(x或红色)而不必命名字段。这可能吗?如果不可能,那么在不改变要求的情况下,我还可以使用哪些其他选项?**我在下面列出了结构体定义,沿着它们与我在这个问题中描述的可能不可能的接口一起使用的一些示例。

难以描述的元组结构

typedef struct
{
    /** The first coordinate */
    double x;

    /** The second coordinate */
    double y;

    /** The third coordinate */
    double z;

} Tuple;

RGB元组结构

typedef struct
{
    /** The first coordinate */
    double red;

    /** The second coordinate */
    double green;

    /** The third coordinate */
    double blue;
} Tuple;

示例用法

Tuple * genericTuple = createVector( 1, 2, 3 ); // create a generic Tuple
printf("%lf", genericTuple->x); // should print 1

Tuple * rgbTuple = createColor( 1, 2, 3 ); // create an rgbTuple
printf("%lf", rgbTuple->red); // should also print 1
oalqel3c

oalqel3c1#

这里的标准答案是使用联合。
一种可能性是结构的并集:

struct named_tuple
{
    /** The first coordinate */
    double red;

    /** The second coordinate */
    double green;

    /** The third coordinate */
    double blue;
};
struct coord_tuple
{
    /** The first coordinate */
    double x;

    /** The second coordinate */
    double y;

    /** The third coordinate */
    double z;

};
typedef union {
  struct named_tuple named;
  struct coord_tuple coord;
} Tuple;

// access:
tuple.named.red = 5;
tuple.coord.x = 42;

相关问题