根据不同类型在运行时实例化模板类

时间:2016-03-25 07:06:34

标签: c++ templates

该计划的组织如下:

  1. 首先,它会读取包含类型信息的文件。

  2. 必须根据该类型实例化一个类。

  3. 例如,如果type = float,我必须实例化一个对象A<float> a

    目前我通过简单if-else语句来处理这项工作。

    if (type == "float") {
        A<float> a;
    }
    

    我想知道是否有一些方法可以像处理变量或其他东西一样处理类型,这让我可以通过A<specific_type> a创建对象而无需判断?

3 个答案:

答案 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 ++中操作它,然后将其保存回文件。会有一个小的性能损失,但对于大多数应用程序,这是不明显的。