有一次我在面试中被问到一个问题。
因此我有一个函数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。
-
参数s给f(std::string s)是运行时数据。
所以除非你在运行时检查字符串并选择一个块,或者一个预定义的模板,用int,比如
if ( s == "int" ){
// declare int
int i;
}
没有合理的方法来做到这一点。
在编译过程中使用具有每种可能数据类型的目标代码对我来说似乎违背了问题的精神。
现在,对于具有适当反射的语言,解决方案大多是微不足道的。Object intObject = Class.forName(s).newInstance();
我最近也在思考这个问题。我提出了一个类成员,它基于某个字符串和if/else块在每个方法的开始处强制转换。
void* data;
string cast; //set cast with some method, could also be enum.
//make methods and/or overloads with cast blocks