在模板中键入条件

时间:2011-06-06 12:19:56

标签: c++ templates conditional

在C ++中给定模板类型的情况下是否可以只构建部分代码? 这将是一个湖泊:

#include <iostream>

using namespace std;

template<typename T>
void printType(T param)
{
    #if T == char*
        cout << "char*" << endl;
    #elif T == int
        cout << "int" << endl;
    #else
        cout << "???" << endl;
    #endif
}

int main()
{
    printType("Hello world!");
    printType(1);
    return 0;
}

5 个答案:

答案 0 :(得分:46)

类型特征:

#include <iostream>
#include <type_traits> // C++0x
//#include <tr1/type_traits> // C++03, use std::tr1

template<typename T>
void printType(T param)
{
  if(std::is_same<T,char*>::value)
        std::cout << "char*" << endl;
  else if(std::is_same<T,int>::value)
        std::cout << "int" << endl;
  else
        std::cout << "???" << endl;
}

或者甚至更好,只是重载函数:

template<class T>
void printType(T partam){
  std::cout << "???" << endl;
}

void printType(char* partam){
  std::cout << "char*" << endl;
}

void printType(int partam){
  std::cout << "int" << endl;
}

部分排序将注意调用正确的函数。此外,在一般情况下,重载优先于模板特化,有关原因,请参阅thisthis artice。如果您完全必须打印类型,可能不适用于您,因为隐式转换被认为是重载函数。

答案 1 :(得分:8)

使用模板专业化:

template<typename T>
void printType(T param)
{
   // code for the general case - or omit the definition to allow only the specialized types
}

template<>
void printType<char*>(char* param)
{
   // code for char*
}

template<>
void printType<int>(int param)
{
   // code for int    
}

// ...

答案 2 :(得分:5)

您可以使用专业化。预处理器在所有模板之前运行,不能与它们交互。

template<typename T> void printType(T t) {
    std::cout << typeid(T).name(); // fallback
}
template<> void printType<char*>(char* ptr) {
    std::cout << "char*";
}
template<> void printType<int>(int val) {
    std::cout << "int";
}

答案 3 :(得分:3)

从C ++ 17开始,有一种方法可以使用if-constexpr完成此操作。以下编译,因为clang-3.9.1,gcc-7.1.0和最近的MSVC编译器19.11.25506处理得很好,选项/ std:c ++ 17。

#include <iostream>
#include <type_traits>

template<typename T>
void printType(T)
{
    if constexpr (std::is_same_v<T, const char*>)
        std::cout << "const char*" << std::endl;
    else if constexpr (std::is_same_v<T, int>)
        std::cout << "int" << std::endl;
    else
        std::cout << "???" << std::endl;
}

int main()
{
    printType("Hello world!");
    printType(1);
    printType(1.1);
    return 0;
}

输出:

const char*
int
???

答案 4 :(得分:2)

您可以使用template specification指定函数的版本,以便根据其类型进行不同的工作。例如,您可以创建一个适用于大多数类型的函数的通用版本,并为例如特定版本制作特定版本。 int会更快。你这样做是这样的:

template <class T>
void printType(T param)
{
    cout<<"Generic version"<<endl;
}
template <>
void printType<int>(int param)
{
    cout<<"Int version"<<endl;
}
template <>
void printType<char>(char param)
{
    cout<<"Char version"<<endl;
}
//Rince and repeat.