C++ 从std::string,C++;

C++ 从std::string,C++;,c++,algorithm,types,character-encoding,stdstring,C++,Algorithm,Types,Character Encoding,Stdstring,有一次我在面试中被问到一个问题 因此,我有一个函数void f(std::string),我将函数调用为thisf(“int”)。因此,我的函数必须在其主体中创建一个局部intx。有没有办法从const char*获取类型。我知道,boost::mpl::vector确实解决了这类问题。谁能告诉我这个技巧吗 如果应该支持用户定义的类型,那么在没有提供显式映射的情况下是不可能的。但对于内置类型,这是可以做到的。您可以实现类型定义的解析器,并将其与函数模板相结合,以迭代方式构造类型。大概是这样的:

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


因此,我有一个函数
void f(std::string)
,我将函数调用为this
f(“int”)
。因此,我的函数必须在其主体中创建一个局部
intx
。有没有办法从
const char*
获取类型。我知道,
boost::mpl::vector
确实解决了这类问题。谁能告诉我这个技巧吗

如果应该支持用户定义的类型,那么在没有提供显式映射的情况下是不可能的。但对于内置类型,这是可以做到的。您可以实现类型定义的解析器,并将其与函数模板相结合,以迭代方式构造类型。大概是这样的:

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.
}
模板
void解析类型(std::string类型)
{
std::string spec=extractionSpecifierFrom(类型);
如果(规格=“[]”){
解析类型(type);
}否则如果(规格=“*”){
解析类型(type);
}否则如果(规格=“常数”){
解析类型(type);
}//等等。
}

我对这个问题的印象是:

  • 在编译阶段创建本地int

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

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

if ( s == "int" ){
    // declare int
   int i;
}
没有合理的方法可以做到这一点

在我看来,在编译过程中让对象代码包含所有可能的数据类型违背了问题的精神


现在,对于具有适当反射的语言,解决方案基本上是微不足道的<代码>对象InObject=Class.forName.newInstance()

我最近也考虑过这个问题。我根据一些字符串和if/else块,在每个方法的开头创建了一个类成员

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

简短的答案似乎是C++不支持反射,但我敢打赌,你可以为面试者提供一些非常荒谬的解决方案。看一看,如果有人能为这个问题提供一个“简单”的可能解决方案,我认为这仍然很有趣。