该计划的组织如下:
首先,它会读取包含类型信息的文件。
必须根据该类型实例化一个类。
例如,如果type = float
,我必须实例化一个对象A<float> a
。
目前我通过简单if-else
语句来处理这项工作。
if (type == "float") {
A<float> a;
}
我想知道是否有一些方法可以像处理变量或其他东西一样处理类型,这让我可以通过A<specific_type> a
创建对象而无需判断?
答案 0 :(得分:1)
你在问这样的事吗?
template <class A>
void workWithA(void)
{
A a ;
}
std::map<std::string, void (*f_ptr)(void)> functions ;
functions["float"] = &workWithA<float> ;
functions["int"] = &workWithA<int> ;
...
然后你可以写
std::string type ;
auto it = functions.find(type) ;
if (it != functions.end())
it->second() ;
答案 1 :(得分:0)
您无法在运行时使用参数更改来实例化模板。
编译时处理模板。如果程序不知道它操作的是什么,你的程序将如何处理?
如果您在程序中使用从您的文件中生成可以使用的lib的工具链,那么仍然可以有一个解决方案......但我不知道这是否值得付出努力。
答案 2 :(得分:0)
这不直接回答你的问题(为什么你需要在运行时实例化一个模板化的类?)但是这里有一种可能......
如果有太多不同类型的类,并且您可以控制数据文件的格式,则可以考虑使用类似XML(https://en.wikipedia.org/wiki/XML)的内容。应该有可用于c ++的XML库,它允许您加载任何类型的复杂结构的文件数据,在c ++中操作它,然后将其保存回文件。会有一个小的性能损失,但对于大多数应用程序,这是不明显的。