C ++在编译期间比较模板类型

时间:2014-10-14 11:12:51

标签: c++ templates macros c-preprocessor typename

我有一个模板类。由于在编译期间处理模板,是否可以在编译期间比较模板参数并使用预处理器添加特定代码?像这样:

template<class T>
class MyClass
{
   public:
      void do()
      {
         #if T is equal to vector<int>
            // add vector<int> specific code
         #if T is equal to list<double>
            // add list<double> specific code
         #else
            cout << "Unsupported data type" << endl;
         #endif
      }
};

如何在编译期间将模板类型与另一种类型进行比较,如上例所示?我不想添加处理特定类型的特定子类。

1 个答案:

答案 0 :(得分:9)

首先要做的事情 - do是一个关键字,你不能拥有该名称的功能 其次,预处理器在编译阶段之前运行,因此使用模板中的东西是不可能的。

最后,你可以只专门化一个类模板的一部分,可以这么说。这将有效:

#include <iostream>
#include <vector>
#include <list>

template<class T>
class MyClass
{
   public:
      void run()
      {
            std::cout << "Unsupported data type" << std::endl;
      }
};

template<>
void MyClass<std::vector<int>>::run()
{
    // vector specific stuff
}

template<>
void MyClass<std::list<double>>::run()
{
    // list specific stuff
}

Live demo.