Mat*_*teo 2 c++ templates types
我有一个模板类,并且想编写一个能够识别模板已被实例化的类型的成员方法.
我需要创建一个字符串标识符,其中包含有关该类型的以下信息:
该方法应返回以下列方式组成的字符串:
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陈述是个好主意吗?(如果是,请你更正语法)位计算没问题,但可以通过使用CHAR_BIT代替来改进8,请参阅此问题.
要获取其他信息,您可以使用<type_traits>,具体来说:
std::is_signed/std::is_unsignedstd::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)
请注意,bool计为无符号整数,但很容易修复.另请注意,编译器会发出一系列关于"条件表达式是常量"的警告,因此可以改进,但这应该足以作为演示了.
| 归档时间: |
|
| 查看次数: |
403 次 |
| 最近记录: |