c++ - 如何编写具有相同名称的相同函数以在 C++ 中几乎相似地处理不同的类参数?
问题描述
我有两个不同的课程
class A_class {
public:
string member_to_add_to;
}
和
class B_class {
string member_to_add_to;
}
它们几乎相似,但成员变量略有不同。不涉及继承。它们都用于不合并在一起的不同部分。我知道这不是一个好的设计,但我们现在没有时间修复它,因为代码库很大。
然后是一个Modifier
类,它引用A_class
or的对象B_class
并对类对象进行一些修改。
class Modifier() {
method1(A_class& object_ or B_class& object);
method2(A_class& object_ or B_class& object);
}
我需要编写一个doSomething()
在类内部调用的函数,该函数Modifier
接收一个对象,该对象是A_class
或B_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 个函数中复制其中的代码两次,除了不同的行?
有没有更优化/可读的方式来做到这一点?
解决方案
使用模板函数:
#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'; }
推荐阅读
- excel - 为其他 PPT 运行 Power Point 宏代码
- excel-formula - excel自动将无效时间转换为有效时间
- python - 无法在不出现 404 错误的情况下更改 Google Sheets API 中的 SCOPES:未找到请求的实体
- java - 如何为 BrowserMobProxyServer 创建日志文件
- domain-driven-design - 微前端和微服务有什么区别
- python - 如何在 get_queryset() 中返回 json?
- c# - 谷歌身份验证永远不会到达 OnCreatingTicket
- javascript - 事件发射器未捕获事件
- powershell - aws cli(在powershell上)在执行下一个命令之前等待cp完成
- java - 监听(注册)接口的特定方法而不实现所有方法,Java