我曾在面试中被问到一个问题。
我有一个函数void f(std::string)
,我这样调用函数:f("int")
。因此,我的函数必须在其体内创建一个本地变量int x
。有没有办法从const char*
中获取类型?我知道boost::mpl::vector
可以解决这种问题。有人能告诉我这个技术吗?
我曾在面试中被问到一个问题。
我有一个函数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的块或预定义模板,否则不需要使用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