在面试中我被问到一个问题。
因此我有一个函数void f(std::string)
,我将函数称为f("int")
。所以我的函数必须在其体内创建一个本地int x
。有没有办法从const char*
获取类型。我知道boost::mpl::vector
确实解决了这类问题。谁能告诉我这项技术?
答案 0 :(得分:3)
如果应该支持用户定义的类型,那么如果没有提供显式映射,则不可能。但对于内置类型,它可以完成。您可以为类型定义实现解析器并将其与函数模板组合,迭代地构造类型。像这样:
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.
}
答案 1 :(得分:1)
我对这个问题的印象是:
在编译阶段完成创建本地int。
f(std :: string s)的参数 s 是运行时数据。
因此,除非您在运行时检查字符串并选择块或预定义模板,否则使用int,例如
if ( s == "int" ){
// declare int
int i;
}
没有合理的方法可以做到这一点。
在编译期间拥有可用的每种可能数据类型的目标代码在我看来都违背了问题的精神。
现在,对于具有适当反射的语言,解决方案基本上是微不足道的。 Object intObject = Class.forName(s).newInstance();
答案 2 :(得分:0)
我最近也想过这个。我想出了一个类成员,它基于一些字符串和if / else块在每个方法的开头被转换。
void* data;
string cast; //set cast with some method, could also be enum.
//make methods and/or overloads with cast blocks