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<代码>不能返回转换后的指针,例如,因为没有返回类型可以使用(至少不是一个可能比Value>代码>更好的工作)。

< P>不能将类型作为C++中的函数参数传递。 您所能做的,与您提出的解决方案最为相似的是,有一个支持类型的硬编码列表,并且将使用的转换类型将由作为第二个参数传递的某种数据(字符、枚举、字符串…)来标识


<>也许更好的是,如果你可以在更高的层次上提出你的问题,并且使用一个更适合于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;

  };
};