C ++函数是否可以采用相同成员的两种不同类型?

时间:2018-08-28 18:30:18

标签: c++

struct typeA
{
  double fieldA;
}

struct typeB
{
  double fieldA;
  double fieldB;
}


void do_stuff(typeA or typeB input)
{
   input.fieldA // I will only use fieldA and will never use fieldB
}

它对性能敏感,所以我不想先将其转换为通用类型。

4 个答案:

答案 0 :(得分:9)

您可以模板化do_stuff函数,编译器将为您检查实现。如果该字段不可用,您将收到一条错误消息。这是一个完整的示例:

struct typeA
{
  double fieldA;
};

struct typeB
{
  double fieldA;
  double fieldB;
};

template <typename T>
void do_stuff(T& input)
{
   input.fieldA = 10.0;
}

int main() {
    typeA a;
    do_stuff(a);

    typeB b;
    do_stuff(b);
}

注意:请记住在;定义的末尾添加分号struct(否则将无法编译)。

答案 1 :(得分:9)

如果您使用通用类型,则不会对性能造成任何影响,

struct typeA
{
  double fieldA;
};

struct typeB: typeA
{
  double fieldB;
};


void do_stuff(typeA & input)
{
   input.fieldA; // I will only use fieldA and will never use fieldB
}

一旦开始使用虚拟方法,您只会开始看到性能下降。除非并且直到您这样做-否则无需支付费用

答案 2 :(得分:3)

您可以为此使用模板系统:

 template <typename T> void do_stuff(const T& val) {
     // Use val.fieldA
 }

在这里,如果您在具有名为do_stuff的字段的对象上调用fieldA,则可以很好地编译并执行所需的操作。如果您尝试在没有fieldA成员的情况下调用它,它将无法编译并会报告错误。

答案 3 :(得分:0)

有趣的是,最简单的解决方案有时会躲避我们。如果您“只会使用fieldA而不会使用fieldB”,那为什么不呢?

void do_stuff(double& fieldA)
{
   fieldA; // I will only use fieldA and will never use fieldB
}

void test()
{
    typeA a{};
    typeB b{};

    do_stuff(a.fieldA);
    do_stuff(b.fieldA);
}

...