【问题标题】:Get type from std::string, C++从 std::string 获取类型,C++
【发布时间】:2015-09-24 15:37:54
【问题描述】:

有一次我在面试中被问到一个问题。

因此我有一个函数void f(std::string),我将一个函数称为f("int")。所以我的函数必须在其主体中创建一个本地int x。有没有办法从const char* 获取类型。我知道boost::mpl::vector 确实解决了这类问题。谁能告诉我技术?

【问题讨论】:

  • 似乎简短的回答是 C++ 不支持反射,但我敢打赌,有一些非常荒谬的变通方法可以让面试官娱乐。看看stackoverflow.com/questions/41453/… 进行反思
  • 我认为如果有人可以为这个问题提供一个“简单”的可能解决方案,这仍然很有趣。

标签: c++ algorithm types character-encoding stdstring


【解决方案1】:

如果应该支持用户定义的类型,那么如果不提供显式映射就不可能。但是对于内置类型,它可以完成。您可以为类型定义实现解析器并将其与函数模板结合起来,迭代地构造类型。像这样的:

template <class T>
void parseType(std::string type)
{
  std::string spec = extractOneSpecifierFrom(type);
  if (spec == "[]") {
    parseType<T[]>(type);
  } else if (spec == "*") {
    parseType<T*>(type);
  } else if (spec == "const") {
    parseType<const T>(type);
  } // ... etc.
}

【讨论】:

    【解决方案2】:

    我对这个问题的印象是:

    • 在编译阶段创建本地 int。

    • f(std::string s) 的参数 s 是运行时数据。

    因此,除非您在运行时检查字符串并选择带有 int 的块或预定义模板,例如

    if ( s == "int" ){
        // declare int
       int i;
    }
    

    没有合理的方法可以做到这一点。

    在我看来,在编译期间提供具有每种可能数据类型的目标代码似乎与问题的精神背道而驰。

    现在,对于具有适当反射的语言,解决方案大多是微不足道的。 Object intObject = Class.forName(s).newInstance();

    【讨论】:

      【解决方案3】:

      我最近也在考虑这个问题。我想出了一个基于某些字符串和 if/else 块在每个方法开始时强制转换的类成员。

      void* data;
      string cast; //set cast with some method, could also be enum.
      //make methods and/or overloads with cast blocks
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-06
        • 1970-01-01
        • 2021-09-18
        • 1970-01-01
        相关资源
        最近更新 更多