C# 通用行为与 C++ 模板

标签 c# c++

我正在尝试将一些 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)和一个具有我的逻辑的 protected 方法(即 MyTypeSafeMethodProt)。然后,我将在每个使用 protected 逻辑的类实现中公开一个新的类型安全方法。

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

最佳答案

将给定代码转换为 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 );
}

关于C# 通用行为与 C++ 模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22762417/

相关文章:

C# 从内部基类中获取派生类型的名称

c# - 为什么我的一些类名在新的 VS 2015 编译器中返回为 "<>c"?

c# - HTML 中的 MailMessage 和文本中的 AlternateView 不起作用

c++ - 使用 boost 的 LU 求解器但避免计算逆矩阵?

c++ - zeromq 轮询器结合了多个请求套接字和发布

c++ - 为什么结构的 sizeof 不等于每个成员的 sizeof 之和?

c# - 是否有带谓词的 String.IndexOf?

c# - 非常简单的C#程序会生成“未处理NullReferenceException”错误

c++ - 像结构成员一样访问 C++14 lambda 捕获

c++ - 在 Windows 上使用 websocketpp 和 MySQL boost 构建错误