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++语法。