具有C++模板的 C# 泛型行为

C# Generic behavior with C++ Templates

本文关键字:泛型 C++ 具有      更新时间:2023-10-16

我正在尝试将一些 C# 代码移植到 C++。我想保持结构相似,但我意识到这可能并不总是可能的。

根据我的研究,C++模板应该比 C# 泛型更强大/更灵活,但我似乎无法重新创建特定行为。

下面是我当前 C# 结构的一个过于简化的示例:

public class MyGeneric<T>
{
    public void MyTypeSafeMethod(T arg1)
    {
        //logic here
    }
}
public class MyImplA : MyGeneric<MyImplA>
{
    //Class config etc..
}
public class MyImplB : MyGeneric<MyImplB>
{
    //Other config etc...
}
public static class MyCollectionOfGenericImpl
{
    public static MyImplA A = new MyImplA();
    public static MyImplB B = new MyImplB();
}
public class Program
{
    void Main()
    {
        //Doesn't compile, method is typesafe 
        MyCollectionOfGenericImpl.A.MyTypeSafeMethod(MyCollectionOfGenericImpl.B);
    }
}

截至目前,我真的没有看到使用 C++ 模板执行此操作的方法(做了一些查看 typedef + 模板,但我看不出这将如何为我工作)。

目前,我的解决方案是完全废弃模板。我将有一个基类(即MyGeneric)和一个受保护的方法(即MyTypeSafeMethodProt),该方法具有我的逻辑。然后,我将在每个利用受保护逻辑的类实现中公开一个新的类型安全方法。

有什么方法可以用模板或其他更少的代码来实现这一点的方法?

将给定的代码转换为C++完全没有问题。这只是一种语法(机械)转换。这会在 main 函数中的调用中重现所需的编译错误。

简而言之,我对感知到的问题是什么感到非常困惑。

但希望它能有所帮助,无论问题如何,以下是具有原始 C# 代码名称的相应C++代码:

template< class T >
struct MyGeneric
{
    void MyTypeSafeMethod( T& arg1 )
    {
        //logic here
    }
};
struct MyImplA : MyGeneric<MyImplA>
{
    //Class config etc..
};
struct MyImplB : MyGeneric<MyImplB>
{
    //Other config etc...
};
struct MyCollectionOfGenericImpl
{
    static MyImplA A;
    static MyImplB B;
};
MyImplA MyCollectionOfGenericImpl::A;
MyImplB MyCollectionOfGenericImpl::B;
auto main()
    -> int
{
    //Doesn't compile, method is typesafe 
    MyCollectionOfGenericImpl::A.MyTypeSafeMethod( MyCollectionOfGenericImpl::B );
}