gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:46:42 25 4
gpt4 key购买 nike

我有一个模板类,我想编写一个成员方法来识别模板被实例化为哪种类型。

我需要创建一个包含以下类型信息的字符串标识符:

  • 位深度
  • 签名或未签名
  • float 或 int 或 char

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

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

BIT_DEPTH -> is the number of bits used to represent type

U | S -> describes if type is signed or unsigned

C | I | F -> describes if type is char int or floating point

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

int bitDepth = sizeof(TemplateType) * 8;

还好吗?

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

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

switch(TemplateType){

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

default: ...;

}

我的问题有两个:

  • 位深计算是否正确?
  • switch-case 语句是个好主意吗? (如果是,请您更正语法)

最佳答案

位计算没问题,但可以通过使用CHAR_BIT来改进而不是 8 , 请参阅 this question .

要获取其他信息,您可以使用 <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";
}

Live example on Ideone.

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

关于c++ - 如何区分 C++ 中的模板类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9518512/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com