C ++ 98:编译时间检测浮点类型

时间:2014-04-14 20:47:51

标签: c++ templates c++98

因此,您可以使用以下内容在C ++ 98中创建伪造的is_integral:

template <typename T>
struct is_integral
{
  static const bool value;
};

template <typename T>
const bool is_integral<T>::value = std::numeric_limits<T>::is_integer;

足够简单......你能为浮点做些什么类似的事情(没有得到提升依赖吗?)

3 个答案:

答案 0 :(得分:3)

C++ standard *声明:

  

应为每种基本类型提供专业化,包括浮点数和整数,包括bool。

(* - 我很难找到早期的标准草案。如果有人可以在这里伸出援助之手,我们将不胜感激。)

由于std::numeric_limits提供了is_integeris_specialized的定义,因此您可以组合这些信息来推断某个类型是否为浮点类型。

例如:

template <typename T>
struct is_floating_point
{
    static const bool value;
};

template <typename T>
const bool is_floating_point<T>::value =
    std::numeric_limits<T>::is_specialized &&  // Is fundamental arithmetic type...
    !std::numeric_limits<T>::is_integer;       // ...that is not an integer

答案 1 :(得分:1)

由于只有三种浮点类型(根据C ++98§3.9.1/ 8),因此枚举它们并不困难:

template <typename T>
struct is_floating_point {
  enum { value = 0 };
};

template <>
struct is_floating_point<float> {
  enum { value = 1 };
};

template <>
struct is_floating_point<double> {
  enum { value = 1 };
};

template <>
struct is_floating_point<long double> {
  enum { value = 1 };
};

答案 2 :(得分:1)

你的is_integral诀窍:

#include <limits>
#include <iostream>

template <typename T>
struct is_floating_point
{
  static const bool value;
};

// is a fundamental type (i.e. not a user defined type) but not an integer
template <typename T>
const bool is_floating_point<T>::value =
!std::numeric_limits<T>::is_integer && std::numeric_limits<T>::is_bounded;

struct Obj
{
};

int main()
{
    std::cout << is_floating_point<float>::value << std::endl;        // 1
    std::cout << is_floating_point<int>::value << std::endl;          // 0
    std::cout << is_floating_point<Obj>::value << std::endl;          // 0
    std::cout << is_floating_point<bool>::value << std::endl;         // 0
    std::cout << is_floating_point<double>::value << std::endl;       // 1
    std::cout << is_floating_point<long double>::value << std::endl;  // 1

    // this would compile since it's an array of size 1
    int Y[is_floating_point<float>::value] = { };
    // this wouldn't compile since it's an array of size 0
    int N[is_floating_point<int>::value] = { };
}