将void指针强制转换为string指定的类型



是否有一种方法将void*指针转换为没有巨大if块的字符串给定的类型?

最理想的是parsePtr(void *ptr, String s) { return static_cast<s>(ptr); }

我尝试使用像#define parsePtr(ptr, type) static_cast<type>(ptr)这样的宏,它适用于类型(如intfloat),但不适用于字符串。

#define parsePtr(ptr, type) type == "int" ? static_cast<int*>(ptr) : static_cast<float*>(ptr)也不适合我。

我知道有人可以这样做:

if (s == "int")
return (int*)ptr;
else if (s == "float")
return (float*)ptr;
else if (s == "char*")
return (char**)ptr;
//....

但是我的代码会很长,很难读。

c++不支持你所要求的。但是,至少可以使用一个std::(unordered_)map而不是一系列if,例如:

using vptr_t = std::variant<int*, float*, char**, etc>;
using convert_func_t = vptr_t (*)(void*);
template <typename T>
vptr_t convert_func(void* ptr) {
return static_cast<T*>(ptr);
}
vptr_t parsePtr(void *ptr, const std::string &type)
{
static const std::unordered_map<std::string, convert_func_t> cvt = {
{"int", &convert_func<int>},
{"float", &convert_func<float>},
{"char*", &convert_func<char*>},
//...
};
return cvt.at(type)(ptr);
}

是否有一种方法可以将void指针转换为由String给定的类型而无需巨大的if块?

不,没有这样的方法。c++程序设计语言是一种静态类型的程序设计语言,这意味着在编译程序之前,每种类型都必须在源文件中输入并单独处理。

正如几个人在评论中已经说过的那样,这不会发生在字符串上。c++是一种静态类型语言,所以这样的运行时转换是不可能的。

然而,c++为这种用例提供了模板元编程。

template <typename T>
T* convert_pointer(void* ptr) {
return static_cast<T*>(ptr);
}

那么你可以调用这个函数

void* my_data = ...;
int* my_int = convert_pointer<int>(my_data);

但是,再一次,这是值得怀疑的效用。更好的问题是这些void指针来自哪里,以及如何确保数据实际上是必要类型的,并且相信函数的调用者在没有任何验证的情况下知道void*的类型是不理想的。

相关内容

最新更新