有没有办法让函数返回一个类型?

时间:2014-03-27 16:54:38

标签: c++ function return-type

我有一个数据类(实际上是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();}

2 个答案:

答案 0 :(得分:1)

在C ++中都不可能:

  • 函数不能返回类型(也就是说,类型不是值)。
  • 代码无法对编译时不知道的类型的对象进行操作(也就是说,C ++是静态类型的)。当然,通过虚函数存在动态多态,但即使这样,用于调用它们的指针类型在编译时也是由调用代码知道的。

所以你想要的操作,“转换为字符串指示的指针类型”是不可能的。如果可能,那么结果将是一个指针,其类型在编译时是未知的,而且不可能。

对于这个“在编译时未知类型的指针”,你无法做到,你不能使用你开始使用的void*void*几乎已经 C ++代替指向未知类型的指针。

答案 1 :(得分:0)

虽然无法从函数返回类型,但可以使用typeid获取有关对象的信息,并使用typeid(*obj).name()返回的字符串作为构造函数的参数。

请记住,此字符串将是实现定义的,因此您必须在运行时为程序中可能使用的每种类型生成此字符串,以使unordered_map有用。

然而,几乎可以肯定,有一种更简单,更惯用的方式来实现C ++中的目标。也许如果你对该计划的目标有更多的解释,有人可能会提出另一种方法。