因此,您可以使用以下内容在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;
足够简单......你能为浮点做些什么类似的事情(没有得到提升依赖吗?)
答案 0 :(得分:3)
C++ standard *声明:
应为每种基本类型提供专业化,包括浮点数和整数,包括bool。
(* - 我很难找到早期的标准草案。如果有人可以在这里伸出援助之手,我们将不胜感激。)
由于std::numeric_limits
提供了is_integer
和is_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] = { };
}