我有一个数据类(实际上是struct)两个变量:一个void指针和一个包含所指向对象类型的字符串。
struct data{
void* index;
std::string type;
data(): index(0), type("null"){}
data(void* index, std::string type): index(index), type(type){}};
现在我需要使用被指向的对象,通过将void指针强制转换为字符串指定的类型,所以我想到使用带字符串和函数的std :: map。
std::unordered_map<std::string, function> cast;
问题是函数必须始终具有完全相同的返回类型,并且不能自己返回类型。
编辑: 因为我使用数据类作为返回类型和参数,模板是不够的。 (还添加了一些代码来表明我的意思)
data somefunction(data a){
//do stuff
return data();}
目前,我使用这样的函数来做这个技巧,但我认为可以更轻松地完成:
void functionforstring(data a){
dynamic_cast<string*>(data.index)->function();}
答案 0 :(得分:1)
在C ++中都不可能:
所以你想要的操作,“转换为字符串指示的指针类型”是不可能的。如果可能,那么结果将是一个指针,其类型在编译时是未知的,而且不可能。
对于这个“在编译时未知类型的指针”,你无法做到,你不能使用你开始使用的void*
。 void*
几乎已经 C ++代替指向未知类型的指针。
答案 1 :(得分:0)
虽然无法从函数返回类型,但可以使用typeid
获取有关对象的信息,并使用typeid(*obj).name()
返回的字符串作为构造函数的参数。
请记住,此字符串将是实现定义的,因此您必须在运行时为程序中可能使用的每种类型生成此字符串,以使unordered_map
有用。
然而,几乎可以肯定,有一种更简单,更惯用的方式来实现C ++中的目标。也许如果你对该计划的目标有更多的解释,有人可能会提出另一种方法。