将模板C++转换为C#

Convert template C++ to C#

本文关键字:转换 C++      更新时间:2023-10-16

我在项目c++中有模板,现在我想把代码翻译成c#,但模板c#中出现了一些错误。

在C++中

template<typename T>
struct pares
{
DWORD64 first;
T* second;
};
template<typename T>
struct hash_node
{
pares<T> mValue;
hash_node<T>* mpNext;
};
template<typename T>
struct hashtable
{
DWORD64 vtable;
hash_node<T>** mpBucketArray;
unsigned int mnBucketCount;
unsigned int mnElementCount;
//...
};
template<typename T>
struct hashtable_iterator
{
hash_node<T>* mpNode;
hash_node<T>** mpBucket;
};

在C#中

public class pair<T>
{
public Int64 first;
public T second;
}
public class hash_node<T> 
{
public pair<T> mValue = new pair<T>();
public hash_node<T> mpNext;
}

public class hashtable<T>
{
public Int64 vtable;
public hash_node<T>[] mpBucketArray;
public int mnBucketCount;
public int mnElementCount;
}
public class hashtable_iterator<T>
{
public hash_node<T> mpNode;
public hash_node<T> mpBucket;
}

在c++项目中的一个函数中,我有这样一行,它很好,没有错误:

hashtable<DWORD64>* table = (hashtable<DWORD64>*)(pObfuscationMgr + 8);

但在C#中出现错误:

无法将类型"long"转换为"hashtable">

hashtable<Int64> table =  (hashtable<Int64>)(pObfuscationMgr + 8);

错误的原因是您告诉编译器将内存位置解释为hashtable<>对象。这在C++中有效,因为你有这样的工具:指针。指针只是一个具有关联类型的内存位置。

您有一个由pObfuscationMgr指向的内存块,您打算创建一个指向hashtable<>的指针,这样就可以将该内存位置(加8(的内容理解为hashtable<>

如果你逐字翻译成C#:

hashtable<Int64> table =  (hashtable<Int64>)(pObfuscationMgr + 8);

指针在转换中丢失,因为C#中没有指针。因此,现在pObfuscationMgr只是long,因此编译器的错误是:无法将long转换为hashtable<>

例如,您可以在C或C++中执行此操作:

void foo()
{
char buffer[1024];
int * ptr1 = (int *) &buffer;
int * ptr2 = (int *) ( &buffer + 8 );

*ptr1 = 40;
*ptr1 += 2;
*ptr2 = 5;
*ptr2 *= 2;
printf( "%dn", *ptr1 ); 
printf( "%dn", *ptr2 ); 
}

在上面的代码中,您将在堆栈中创建一个char数组形状的缓冲区。然后创建ptr1ptr2指针,使它们指向该区域的开始和该区域的开头加8。然后,您可以管理这两个指针,就好像它们指向真实的变量一样。这或多或少与原始代码的功能相似。

把C++代码逐字翻译成C#是不会成功的。当然,翻译是可以实现的,但对C++中的内存以及如何在C#中表示内存有深入的了解,即进行真正的翻译。

希望这(以某种方式(有所帮助。