如何根据运行时输入实例化 c++ 模板?

Posted

技术标签:

【中文标题】如何根据运行时输入实例化 c++ 模板?【英文标题】:How to instantiate c++ template according to runtime input? 【发布时间】:2019-06-07 03:53:07 【问题描述】:

我定义了一个模板函数,想根据不同的输入调用不同的特化:

// function
template <typename T>
void f() ...

// specialization 1
template <>
void f<C1>()  ... 

// specialization 2
template <>
void f<C2>()  ... 


// class 
class Cbase ;

class C1 : Cbase ;

class C2 : Cbase ;

int main()

    std::string s = input();
    Cbase* c;

    if (s == "c1")
    
      // here I want to use `specialization 1` but not 
      // call immediately here but later, so I create an instance of C1
      c = new C1;
    
    else
    
      // here I want to use `specialization 2` but not
      // call immediately here but later, so I create an instance of C2
     c = new C2;
    

    // Is there a way to call specializations according to the type of `c`? 
    // Can I get the type in the runtime to call the particular 
    // template specializations I want?

有没有办法根据 c 调用专业化?我可以在运行时获取类型来调用我想要的特定模板特化吗?

【问题讨论】:

【参考方案1】:

没有。根据定义,模板是编译时构造。如果您需要运行时多态性,那么您基本上应该寻找虚函数。

【讨论】:

【参考方案2】:

将您的程序重组为:

template <typename T>
void main_function()

    T c;

    // f<T>();
    // ...


int main()

    std::string s = input();

    if (s == "c1")
    
        main_function<C1>();
    
    else
    
        main_function<C2>();
    

【讨论】:

以上是关于如何根据运行时输入实例化 c++ 模板?的主要内容,如果未能解决你的问题,请参考以下文章

函数申明对函数模板实例化的屏蔽

函数模板参数的C++模板实例化

C++从青铜到王者第六篇:C++模板初阶

在运行时定义的 C++ 纯虚方法

C++初阶模板

c++中另一个类中的模板类实例化