c++ - 使用 g++ 预处理器检测 size_t 是否内置

标签 c++ g++ built-in size-t

Mac OS/X 声明使用内置的 size_t 如下:

typedef __SIZE_TYPE__ size_t;

这使得 size_t 成为一种不同于任何其他类型(例如 unsigned long)的类型。这在 PPC 和 amd64 上是正确的。

当用 i386 编译时,我们得到通常的:

typedef unsigned long size_t;

这样我的其余开发就可以按预期工作。但是,当 size_t 定义为内部类型时,我必须向我的类添加声明。

所以我需要知道类是否应该有那个定义。像这样:

class my_class
{
    ...
    void func(unsigned long ul);
#if SIZE_T_BUILTIN
    void func(size_t s);
#endif
    ...
};

什么是 SIZE_T_BUILTIN 才能正确检测到 size_t 是它自己的类型?

此时我只需要 g++。

最佳答案

与其检测 size_t 是否是您知道的类型之一,您可以只定义它是否不是您已经重载的类型之一,例如:

void func(unsigned long);
template <typename T>
std::enable_if<!std::is_same<size_t, unsigned long>::value
               && std::is_same<T, size_t>::value>::type func(T);

无论 func() 是否是成员,这都可以完成。主要技巧是使条件重载成为函数模板,以便您可以使用 SFINAE 有条件地禁用它。

关于c++ - 使用 g++ 预处理器检测 size_t 是否内置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25456384/

相关文章:

postgresql - Postgres 是否有系统表列出 date_trunc 的精度值?

c++ - 优化构造函数调用次数

python - 与boost python的静态链接

c - 内置函数的位置 Microchip C30 编译器

c++真的很困惑链接错误

g++ - 忽略使用属性 warn_unused_result [-Wunused-result] 声明的 ‘int scanf(const char*, ...)’ 的返回值?

javascript - 省略或修改/扩展内置 javascript 方法以实现兼容性

C++ cpp 文件作为模块

c++使用冒泡排序自定义排序 vector

c++ - 枚举数组相对于常量和宏的优势?