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
}
它对性能敏感,所以我不想先将其转换为通用类型。
答案 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);
}
...