如何区分C++中的模板类型

Mat*_*teo 2 c++ templates types

我有一个模板类,并且想编写一个能够识别模板已被实例化的类型的成员方法.

我需要创建一个字符串标识符,其中包含有关该类型的以下信息:

  • 位深度
  • 签名或未签名
  • 浮点或int或char

该方法应返回以下列方式组成的字符串:

string:(BIT_DEPTH) - (U | S) - (C | I | F)

BIT_DEPTH - >是用于表示类型的位数

U | S - >描述类型是有符号还是无符号

C | 我| F - >描述type是char int还是浮点

我想到了一种找到深度的方法:

int bitDepth = sizeof(TemplateType) * 8;
Run Code Online (Sandbox Code Playgroud)

好吗?

但是不知道如何找到我需要的其他信息,除非switch-case下面的声明是可以的(但不要这么认为):

THE FOLLOWING IS PSEUDO CODE THAT YOU SHOULD HELP ME EXPRESS IN A CORRECT SYNTAX

switch(TemplateType){

    case signed: ...;
    case unsigned: ...;

    default: ...;

}
Run Code Online (Sandbox Code Playgroud)

我的问题是两个:

  • 位深度计算是否正确?
  • 这个switch-case陈述是个好主意吗?(如果是,请你更正语法)

Xeo*_*Xeo 7

位计算没问题,但可以通过使用CHAR_BIT代替来改进8,请参阅此问题.

要获取其他信息,您可以使用<type_traits>,具体来说:

  • std::is_signed/std::is_unsigned
  • std::is_integral/std::is_floating_point

请注意,浮点类型始终是有符号的,但std::is_signed会返回false,因为它会测试类型是否为有符号整数.

另请注意,这char只是另一种整数类型,因此没有专门测试它的标准类型特征,但您可以使用简单的std::is_same<T, char>.

在代码中,这可能如下所示:

#include <iostream>
#include <type_traits>
#include <climits> // CHAR_BIT

template<class T>
void f(){
  std::cout << sizeof(T) * CHAR_BIT << "-";
  if(std::is_integral<T>::value){
     if(std::is_signed<T>::value)
       std::cout << "S";
     else
       std::cout << "U";
     std::cout << "-";
     if(std::is_same<T, char>::value)
       std::cout << "C";
     else
       std::cout << "I";
  }else if(std::is_floating_point<T>::value){
    std::cout << "S-F";
  }
  std::cout << "\n";
}
Run Code Online (Sandbox Code Playgroud)

Ideone上的实例.

请注意,bool计为无符号整数,但很容易修复.另请注意,编译器会发出一系列关于"条件表达式是常量"的警告,因此可以改进,但这应该足以作为演示了.