C++ 如何在C++;
我有一个模板类,希望编写一个成员方法,能够识别模板被实例化为什么类型 我需要创建包含以下类型信息的字符串标识符:C++ 如何在C++;,c++,templates,types,C++,Templates,Types,我有一个模板类,希望编写一个成员方法,能够识别模板被实例化为什么类型 我需要创建包含以下类型信息的字符串标识符: 钻头深度 签名还是未签名 浮点或int或char 该方法应返回按以下方式组成的字符串: 字符串:(比特深度)-(比特深度)-(比特深度)-(比特深度)-(比特深度)-(比特深度)-(比特深度)-(比特深度)-(比特深度)-(比特深度)-(比特深度)-(比特深度)-(比特深度)-(比特深度)-(比特深度)-(比特深度)-(比特深度)-(比特深度)-(比特深度) BIT_DEPTH-
- 钻头深度
- 签名还是未签名
- 浮点或int或char
int bitDepth = sizeof(TemplateType) * 8;
可以吗
但是我不知道如何找到我需要的其他信息,除非像下面这样的开关盒
语句是可以的(但我不这么认为):
我的问题有两个:
- 钻头深度计算正确吗
语句是个好主意吗?(如果是,请更正语法)开关盒
CHAR\u位
而不是8
来改进,请参阅
要获取其他信息,您可以使用,特别是:
/std::is_signed
std::is_unsigned
/std::is_integral
std::is_floating_point
std::is_signed
将返回false,因为它测试类型是否为有符号整数
还要注意的是,char
只是另一个整数类型,因此没有标准的类型特征来专门测试它,但是您可以使用一个简单的std::is_same
在代码中,这可能如下所示:
#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";
}
#包括
#包括
#包括//CHAR\u位
模板
void f(){
std::cout要添加到Xeo的答案中,您可以在编译时使用std::enable_if
删除这些警告。例如:
template<typename T>
inline
typename std::enable_if<std::is_signed<T>::value, char>::type
sign() { return 'S'; }
template<typename T>
inline
typename std::enable_if<std::is_unsigned<T>::value, char>::type
sign() { return 'U'; }
模板
内联
typename std::enable_if::type
sign(){return'S';}
模板
内联
typename std::enable_if::type
符号(){return'U';}
不过,需要注意的一件事是被签名为float
是false
!您考虑过运行时类型标识吗?(RTTI?)和/或动态投射或重新解释投射并测试结果?@therobyouknow实际上不,我对这种东西很陌生。你能给我指出一些方向吗?唯一的解决方案是如上所述的RTTI,但我个人建议重新设计并利用多态性哇,你太棒了!太棒了!@Xeo:回答得太好了+1的正确性、简洁性和大量的一般信息。@Xeo我从编译器那里得到一个错误,说错误:'is_integral'不是'std'
的成员。g++版本4.5.2支持
吗?@Matteo:您需要将-std=c++0x
传递给g++,因为
是c++11头。或者您可以achar-sign[2]={'U',S'};
并使用sign[std::is_signed::value]
进行索引。我刚刚注意到您更愿意使用std::is_unsigned
并翻转数组元素。这样,即使对于浮点类型,结果也将是正确的。
template<typename T>
inline
typename std::enable_if<std::is_signed<T>::value, char>::type
sign() { return 'S'; }
template<typename T>
inline
typename std::enable_if<std::is_unsigned<T>::value, char>::type
sign() { return 'U'; }