从 std::string 获取类型,C++
Get type from std::string, C++
有一次面试的时候被问到一个问题
因此我有一个函数 void f(std::string)
,我调用这个函数 f("int")
。所以我的函数必须在其主体中创建一个本地 int x
。有没有办法从 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.
}
我对这个问题的印象是:
创建本地 int 是在编译阶段完成的。
f(std::string s) 的参数 s 是运行时数据。
因此,除非您在运行时检查字符串并选择一个带有 int 的块或预定义模板,例如
if ( s == "int" ){
// declare int
int i;
}
没有合理的方法可以做到这一点。
在编译期间让目标代码包含所有可能的数据类型在我看来违背了问题的精神。
现在,使用具有适当反射的语言,解决方案大多是微不足道的。 Object intObject = Class.forName(s).newInstance();
我最近也在想这个问题。我想出了一个 class 成员,它基于一些字符串和 if/else 块在每个方法的开头被强制转换。
void* data;
string cast; //set cast with some method, could also be enum.
//make methods and/or overloads with cast blocks
有一次面试的时候被问到一个问题
因此我有一个函数 void f(std::string)
,我调用这个函数 f("int")
。所以我的函数必须在其主体中创建一个本地 int x
。有没有办法从 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.
}
我对这个问题的印象是:
创建本地 int 是在编译阶段完成的。
f(std::string s) 的参数 s 是运行时数据。
因此,除非您在运行时检查字符串并选择一个带有 int 的块或预定义模板,例如
if ( s == "int" ){
// declare int
int i;
}
没有合理的方法可以做到这一点。
在编译期间让目标代码包含所有可能的数据类型在我看来违背了问题的精神。
现在,使用具有适当反射的语言,解决方案大多是微不足道的。 Object intObject = Class.forName(s).newInstance();
我最近也在想这个问题。我想出了一个 class 成员,它基于一些字符串和 if/else 块在每个方法的开头被强制转换。
void* data;
string cast; //set cast with some method, could also be enum.
//make methods and/or overloads with cast blocks