C++ 旧项目中的重复代码删除策略
我最近开始做一个遗留项目。我可以看到以下格式的大量代码重复:C++ 旧项目中的重复代码删除策略,c++,polymorphism,variant,C++,Polymorphism,Variant,我最近开始做一个遗留项目。我可以看到以下格式的大量代码重复: void somefunc(arg1,arg2,Type1 * Ptr) { //some logic } //在Type2上重载 void somefunc(arg1,arg2,Type2 * Ptr) { //same logic } 这两个函数之间的唯一区别是 第三个参数Type1和Type2是从Type派生出来的 类型在运行时确定。所以我试过这样的方法 void somefunc(arg1
void somefunc(arg1,arg2,Type1 * Ptr)
{
//some logic
}
//在Type2上重载
void somefunc(arg1,arg2,Type2 * Ptr)
{
//same logic
}
这两个函数之间的唯一区别是
第三个参数Type1和Type2是从Type派生出来的
类型在运行时确定。所以我试过这样的方法
void somefunc(arg1,arg2,Type * Ptr)
{
if (arg1.version > 14)
Type1 *ptr = dynamic_cast<Type1*>(Ptr);
else
Type2 *ptr = dynamic_cast<Type2*>(Ptr);
//some logic using ptr
}
void somefunc(arg1,arg2,Type * Ptr)
{
if (arg1.version > 14)
Type1 *ptr = dynamic_cast<Type1*>(Ptr);
else
Type2 *ptr = dynamic_cast<Type2*>(Ptr);
//some logic using ptr
}
void somefunc(arg1,arg2,类型*Ptr)
{
如果(arg1.version>14)
类型1*ptr=动态投影(ptr);
其他的
类型2*ptr=动态投影(ptr);
//使用ptr的一些逻辑
}
但它需要一个动态转换来确定运行时的正确类型。我必须在很多地方用if-else块更新代码
想到了Boost变体。这似乎与上述方法类似
有没有更简单/优雅的方法来避免这种代码重复
有没有更简单/优雅的方法来避免这种代码重复
最简单的方法是使somefunc()
成为模板函数:
template <typename T>
void somefunc(arg1,arg2,T* Ptr)
{
//some logic
}
类型在运行时确定。所以我试过这样的方法
void somefunc(arg1,arg2,Type * Ptr)
{
if (arg1.version > 14)
Type1 *ptr = dynamic_cast<Type1*>(Ptr);
else
Type2 *ptr = dynamic_cast<Type2*>(Ptr);
//some logic using ptr
}
void somefunc(arg1,arg2,Type * Ptr)
{
if (arg1.version > 14)
Type1 *ptr = dynamic_cast<Type1*>(Ptr);
else
Type2 *ptr = dynamic_cast<Type2*>(Ptr);
//some logic using ptr
}
void somefunc(arg1,arg2,类型*Ptr)
{
如果(arg1.version>14)
类型1*ptr=动态投影(ptr);
其他的
类型2*ptr=动态投影(ptr);
//使用ptr的一些逻辑
}
这是行不通的,因为
ptr
仅在if
/else
作用域块中声明可见,您需要再次复制逻辑。如果您有多态类,并且需要用动态强制转换进行区分,那么您的设计可能是错误的。您可以在问题中添加示例声明。此外,您还可以避免使用动态\u cast
您可以将类型
设置为a,这将是静态多态性,所有内容都在编译时确定。@DeiDei,TBF经常会发现遗留代码的这种设计缺陷。请正确地格式化代码块并使用实际的C++语法。