首页 > 解决方案 > 如何编写具有相同名称的相同函数以在 C++ 中几乎相似地处理不同的类参数?

问题描述

我有两个不同的课程

class A_class {
public:
    string member_to_add_to;
}

class B_class {
    string member_to_add_to;
}

它们几乎相似,但成员变量略有不同。不涉及继承。它们都用于不合并在一起的不同部分。我知道这不是一个好的设计,但我们现在没有时间修复它,因为代码库很大。

然后是一个Modifier类,它引用A_classor的对象B_class并对类对象进行一些修改。

class Modifier() {
  method1(A_class& object_ or B_class& object);
  method2(A_class& object_ or B_class& object);
}

我需要编写一个doSomething()在类内部调用的函数,该函数Modifier接收一个对象,该对象是A_classB_class连同一个字符串参数,该字符串参数将成员变量member_to_add_to设置为字符串参数并在Modifier. 根据输入此函数的对象类型,只有两行不同。

void doSomething(A_class (or) B_class object_to_modify, string member_value) {
  object_to_modify.member_to_add_to = member_value;
  // after this 5 to 10 steps that call other methods taking a reference to object_to_modify but do the same thing
  method1(object_to_modify);
  method2(object_to_modify);
  //etc.,
}

除了涉及这两个类之外,该函数中的其他所有内容都是相同的确切代码。我是否应该分别对两个对象使用函数重载,并在 2 个函数中复制其中的代码两次,除了不同的行?

有没有更优化/可读的方式来做到这一点?

标签: c++classoopoverloading

解决方案


使用模板函数:

#include <iostream>
#include <type_traits>

结构 A {
    字符常量*数据;
};

结构 B {
    字符常量*数据;
};

模板 <typename T,
    std::enable_if_t<std::is_same_v<T, A> || std::is_same_v<T, B>, int> = 0
>
无效 doSomething(T const& arg) {
    std::cout << arg.data << '\n';
}

int main() {
    一个{“你好”};
    B b{“世界”};
    富(一);
    富(乙);
    // foo("别的东西"); // 不编译
}

C++20 概念的混乱程度略低:

#include <concepts>

template <typename T>
void doSomething(T const& arg) requires (std::same_as<T, A> || std::same_as<T, B>) {
    std::cout << arg.data << '\n';
}

如果这是您遇到的常见问题,您甚至可以将这样的概念过度设计到您的代码库中:

模板 <typename T, typename ...Types>
概念 one_of = (std::same_as<T, Types> || ...);

模板 <one_of<A, B> T>
无效 doSomething(T const& arg) {
    std::cout << arg.data << '\n';
}

推荐阅读