Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在C++;_C++_Templates_Types - Fatal编程技术网

C++ 如何在C++;

C++ 如何在C++;,c++,templates,types,C++,Templates,Types,我有一个模板类,希望编写一个成员方法,能够识别模板被实例化为什么类型 我需要创建包含以下类型信息的字符串标识符: 钻头深度 签名还是未签名 浮点或int或char 该方法应返回按以下方式组成的字符串: 字符串:(比特深度)-(比特深度)-(比特深度)-(比特深度)-(比特深度)-(比特深度)-(比特深度)-(比特深度)-(比特深度)-(比特深度)-(比特深度)-(比特深度)-(比特深度)-(比特深度)-(比特深度)-(比特深度)-(比特深度)-(比特深度)-(比特深度) BIT_DEPTH-

我有一个模板类,希望编写一个成员方法,能够识别模板被实例化为什么类型

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

  • 钻头深度
  • 签名还是未签名
  • 浮点或int或char
该方法应返回按以下方式组成的字符串:

字符串:(比特深度)-(比特深度)-(比特深度)-(比特深度)-(比特深度)-(比特深度)-(比特深度)-(比特深度)-(比特深度)-(比特深度)-(比特深度)-(比特深度)-(比特深度)-(比特深度)-(比特深度)-(比特深度)-(比特深度)-(比特深度)-(比特深度)

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

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

C | I | F->描述类型是字符int还是浮点

我想到了一种方法,可以找到一点深度:

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头。或者您可以a
char-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'; }