将模板C++转换为C#
Convert template C++ to C#
我在项目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
数组形状的缓冲区。然后创建ptr1
和ptr2
指针,使它们指向该区域的开始和该区域的开头加8。然后,您可以管理这两个指针,就好像它们指向真实的变量一样。这或多或少与原始代码的功能相似。
把C++代码逐字翻译成C#是不会成功的。当然,翻译是可以实现的,但对C++中的内存以及如何在C#中表示内存有深入的了解,即进行真正的翻译。
希望这(以某种方式(有所帮助。
相关文章:
- 防止主数据类型C++的隐式转换
- 模板参数替换失败,并且未完成隐式转换
- 努力将整数转换为链表。不知道我在这里做错了什么
- HEX值到wchar_t字符(UTF-8)的转换
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将 Qvector<uint8_t> 转换为 QString
- 如何在cuSparse中使用cusparseXcoo2csr从coo转换为csc
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 在c++中使用nlohmann从类到json的转换
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 如何使用OpenCV将RBG图像转换为HSV,并将H、S和V值保存为C++中的3个独立图像
- 复制列表初始化的隐式转换的等级是多少
- 正在将指针转换为范围
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- 将"打开的CV图像"中的"颜色"转换为整数格式
- 是否可以从int转换为enum类类型
- 了解 GLM- openGL 中的相机转换
- 将无符号char*转换为std::istream*C++