c++ - 发送新类型作为参数

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

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

注意该方法是虚拟的。

最佳答案

似乎您想要使用模板来代替,这是您通常“传递”类型的方式:

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 * 更好用)。

关于c++ - 发送新类型作为参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25767933/

相关文章:

c++ - MPI-2 中的段错误

c++ - 调试 X11 程序时如何避免 SIGPIPE(由于超时?)?

c++ - 前向声明 typedef

c - 结构和类型定义

c++ - 使用 ShellExecute Properties Verb 的特定属性选项卡

c++ - 如何在 VB.net 中包含/导入 C++ 应用程序

java - Struts2 INPUT 结果 : how does it work? 如何处理转换/验证错误?

java - 将 double 转换为 int

c++ - 使用 C++ 选择性地访问数据类型的位

c++ - 什么是 typedef int var[1];做?