C++ 如何定义自定义跨平台尺寸类型?

C++ 如何定义自定义跨平台尺寸类型?,c++,c++11,c++03,size-t,size-type,C++,C++11,C++03,Size T,Size Type,通常用于数组索引和循环计数。根据定义,是sizeof运算符以及sizeof…运算符和alignof运算符(自C++11以来)结果的无符号整数类型。它在以下标题中定义: 据我所知,这些操作符返回的类型是实现定义的 我想要的是定义一个自定义的size\t,以避免从我的.cpp文件中的上述任何标题中提取不必要的内容,因为在我的文件中,我只需要std::size\t 在C++11及更高版本中,我认为可以使用以下别名: using size_t = decltype(sizeof(1));

通常用于数组索引和循环计数。根据定义,是
sizeof
运算符以及
sizeof…
运算符和
alignof
运算符(自C++11以来)结果的无符号整数类型。它在以下标题中定义:

据我所知,这些操作符返回的类型是实现定义的

我想要的是定义一个自定义的
size\t
,以避免从我的
.cpp
文件中的上述任何标题中提取不必要的内容,因为在我的文件中,我只需要
std::size\t

在C++11及更高版本中,我认为可以使用以下别名:

using size_t = decltype(sizeof(1));
但是,我想以可移植/跨平台的方式为C++11之前的编译器定义一个
size\t
类型

那么,对于C++11之前的版本,是否有一种可移植的方法来定义
size\t

不幸的是,“实现定义”包括头文件,而不仅仅是编译器本身。如果你看一下,他们似乎建议只使用这个:

#include <cstddef>
#包括

据我所知,您已经列出了获得
大小的两种跨平台方法:包括来自标准标题的定义,或decltype(自C++11以来)。但这两个都是明确不可用的


第三个选项是手动移植,即使用预定义的宏来检测环境,并从手动维护的typedef列表中选择正确的typedef。例如,在GCC上,您可以使用(但是,考虑文档中的警告,宏不应该直接使用,并且它不在所有平台上提供)。在其他编译器上,您可能会使用其他编译器。

理论上,如果列出所有可能(未签名)的
size\t
候选者都不会困扰您,您可以使用SFINAE:

template <class T, class N = void, bool = sizeof(T) == sizeof(sizeof(T))>
struct TL { 
    typedef typename N::type type;
};

template <class T, class N>
struct TL<T, N, true> {
    typedef T type;
};

typedef TL<unsigned short,TL<unsigned int, TL<unsigned long, TL<unsigned long long> > > >::type SizeT;

您可能应该将此问题标记为C++03或C++98,而不是C++11,对吗?为什么不包含任何标准头文件?它们通常没有那么大,不会显著影响编译时间。由于定义了
size\t
的函数中没有任何函数定义,这意味着也不会为它们生成任何代码。您可以通过这样定义您自己的类型来详细说明您想要解决的实际问题吗?
cstdef
是一个非常小的标题,就符号而言。把它拉进去真的是太多的名称空间污染吗?你可以重做定义一个自定义类型是否可以避免包含一个包含标准定义的头?无论如何,任何标准容器类型都有
size\u type
,您可以使用我知道。我只是指出C++标准有点奇怪,因为它们不需要内置的语言特征(比如siZeof和)必须由内置类型(不需要包括)来支持。Dude是什么样的魔法?!?!?!!!!101010你可以叫我胡迪尼;)
template <class U>
U *declptrval(U);

template <class U>
char is_exact(U *);

template <class U>
short is_exact(...);

template <class T, class N = void, bool = sizeof(is_exact<T>(declptrval(sizeof(T))))==sizeof(char)>
struct TL { 
    typedef typename N::type type;
};

template <class T, class N>
struct TL<T, N, true> {
    typedef T type;
};

typedef TL<unsigned short,TL<unsigned int, TL<unsigned long, TL<unsigned long long> > > >::type SizeT;