我正在尝试将一些 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/