发送新类型作为参数

时间:2014-09-10 14:23:10

标签: c++ casting typedef void-pointers

以下方法旨在将指向变量的指针转换回原始类型。

该方法应该得到2个参数:指向变量的指针及其类型。

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);

我应该如何声明第二个参数的类型?

N.B。该方法是虚拟的。

2 个答案:

答案 0 :(得分:3)

好像你想要使用模板,这就是你通常的方式"传递"类型:

template <typename T>
T myMethod(void * pointer)
{
    return *(T *)pointer;
}

随后:

typedef decltype(i) myType;

myType result = myMethod<myType>(pointerToI);

我唯一能想到的就是提供一个lambda来完成所需的任何转换。但请注意,该类型只能出现在lambda中; myMethod无法与该类型进行任何互动,因为它不知道该类型是什么。例如:

void myMethod(void * pointer, std::function<void(void *)> fn)
{
    fn(pointer);
}

叫做:

myMethod(pointerToI, [] (void * p) { /* do something with p */ });

当然,这并没有让myMethod能够对该类型做出明智的事情,因为myMethod不能同时是虚拟的和模板。因此,这种方法不太可能对您有所帮助。例如,myMethod无法返回已转换的指针,因为您无法使用返回类型(至少不会有一种可能比void *更好的返回类型)。

答案 1 :(得分:0)

您不能在C ++中将类型作为函数参数传递。 您可以做的,与您提出的解决方案最相似的是,它具有受支持类型的硬编码列表,并且将使用的转换类型将通过作为第二个参数传递的某种数据来识别(字符, enum,一个字符串...)。

    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;

  };
};

但是,如果您可以在更高级别制定问题,并使用更适合C ++中可用的机制和工具的其他解决方案,那么可能会更好。