C++ 将新类型作为参数发送
下面的方法旨在将指向变量的指针转换回原始类型 该方法应获得两个参数:指向变量的指针及其类型C++ 将新类型作为参数发送,c++,casting,typedef,void-pointers,C++,Casting,Typedef,Void Pointers,下面的方法旨在将指向变量的指针转换回原始类型 该方法应获得两个参数:指向变量的指针及其类型 void myMethod(void *pointer, ? myType) { //convert the pointer to its original type myType p = *((myType*) pointer); } 用法: int i = 3; void *pointerToI = &i; //The type to send to method t
void myMethod(void *pointer, ? myType)
{
//convert the pointer to its original type
myType p = *((myType*) pointer);
}
用法:
int i = 3;
void *pointerToI = &i;
//The type to send to method
typedef decltype(i) myType;
myMethod(pointerToI, ? myType);
我应该如何声明第二个参数的类型
注意:该方法是虚拟的。似乎您希望使用模板,这是您通常“传递”类型的方式: 被称为:
myMethod(pointerToI, [] (void * p) { /* do something with p */ });
当然,这并不能使您真正了解到
myMethod
能够对类型进行智能化处理,因为myMethod
不能既是虚拟的,又是模板。因此,这种方法不太可能对您有所帮助<例如,code>myMethod无法返回转换后的指针,因为没有可以使用的返回类型(至少没有一种可能比void*
更好的返回类型)。似乎您希望改为使用模板,这是您通常“传递”类型的方式:
被称为:
myMethod(pointerToI, [] (void * p) { /* do something with p */ });
当然,这并不能使您真正了解到
myMethod
能够对类型进行智能化处理,因为myMethod
不能既是虚拟的,又是模板。因此,这种方法不太可能对您有所帮助<例如,code>myMethod无法返回转换后的指针,因为没有可以使用的返回类型(至少没有一种可能比void*
更好的返回类型)。似乎您希望改为使用模板,这是您通常“传递”类型的方式:
被称为:
myMethod(pointerToI, [] (void * p) { /* do something with p */ });
当然,这并不能使您真正了解到
myMethod
能够对类型进行智能化处理,因为myMethod
不能既是虚拟的,又是模板。因此,这种方法不太可能对您有所帮助<例如,code>myMethod无法返回转换后的指针,因为没有可以使用的返回类型(至少没有一种可能比void*
更好的返回类型)。似乎您希望改为使用模板,这是您通常“传递”类型的方式:
被称为:
myMethod(pointerToI, [] (void * p) { /* do something with p */ });
当然,这并不能使您真正了解到
myMethod
能够对类型进行智能化处理,因为myMethod
不能既是虚拟的,又是模板。因此,这种方法不太可能对您有所帮助<代码> MyFrase<代码>不能返回转换后的指针,例如,因为没有返回类型可以使用(至少不是一个可能比<>也许更好的是,如果你可以在更高的层次上提出你的问题,并且使用一个更适合于C++中的机制和工具的不同解决方案。 你不能把类型作为C++中的函数参数传递。 您所能做的,与您提出的解决方案最为相似的是,有一个支持类型的硬编码列表,并且将使用的转换类型将由作为第二个参数传递的某种数据(字符、枚举、字符串…)来标识
<>也许更好的是,如果你可以在更高的层次上提出你的问题,并且使用一个更适合于C++中的机制和工具的不同解决方案。 你不能把类型作为C++中的函数参数传递。 您所能做的,与您提出的解决方案最为相似的是,有一个支持类型的硬编码列表,并且将使用的转换类型将由作为第二个参数传递的某种数据(字符、枚举、字符串…)来标识
<>也许更好的是,如果你可以在更高的层次上提出你的问题,并且使用一个更适合于C++中的机制和工具的不同解决方案。 你不能把类型作为C++中的函数参数传递。 您所能做的,与您提出的解决方案最为相似的是,有一个支持类型的硬编码列表,并且将使用的转换类型将由作为第二个参数传递的某种数据(字符、枚举、字符串…)来标识
如果你能在更高的层次上提出你的问题,并且使用一个更适合C++中的机制和工具的不同解决方案。谢谢,好主意,但是方法是虚拟的。有什么想法吗?我不确定你有什么选择。如果启用了RTTI,则可以使用RTTI确定类型,但强制转换是一个编译时操作;我不确定在编译时未知的情况下,如何让该方法将指针强制转换为正确的类型。(在运行时找出类型并不能真正帮助您强制转换它,除非您已经为您遇到的每种类型提供了一个方法。)我为每种类型提供了方法,并且希望避免使用它。我可以在编译时声明MyType并在运行时更改它吗?我有一个想法,但需要运行几个小时。如果没有人比我抢先一步,我会在我回来的时候发布。谢谢,好主意,但是这个方法是虚拟的。有什么想法吗?我不确定你有什么选择。如果启用了RTTI,则可以使用RTTI确定类型,但强制转换是一个编译时操作;我不确定在编译时未知的情况下,如何让该方法将指针强制转换为正确的类型。(在运行时找出类型并不能真正帮助您强制转换它,除非您已经为您遇到的每种类型提供了一个方法。)我为每种类型提供了方法,并且希望避免使用它。我可以吃午饭吗
class MyClass{
};
enum class Types {Int,Float,MyClass};
void myMethod(void* ptr, Types type){
switch(type){
case Types::Int:
{
int val = *((int*) ptr);
//The rest of the `int` branch goes here
};
break;
case Types::Float:
{
float val = *((float*) ptr);
//...
};
break;
case Types::MyClass:
{
MyClass val = *((MyClass*) ptr);
//...
};
break;
};
};