c++ - 内联函数,它等于 “sizeof expression”,但是返回一个带符号的值

标签 c++

是否可以围绕“sizeof expression”创建内联函数包装器,该包装器返回带符号的数字?

包装函数的外观如何?它应该与所有类型的表达式(C数组等)一起使用,因此可以是sizeof的一对一替换,但它返回带符号的数字。

因此,基本上,我想要一个ssizeof,它返回一个带符号的数字,如下所示:

constexpr std::ptrdiff_t ssizeof(X) {
    return static_cast<std::ptrdiff_t>(sizeof(X));
}

因此,例如:
long a;
int b = 8;

// no signed/unsigned comparison warning here, because
// ssizeof(a) returns a signed number
if (ssizeof(a)<b) {
}

由于自动的array-> pointer衰减规则,解决方案可能不是那么简单(也许还有其他问题?)。

如果无法进行一对一替换(因为ssizeof的参数将始终被评估),如果允许评估,是否可以这样做?

最佳答案

要开始使用,可以使用模板:

#include <iostream>

template <typename T>
constexpr std::ptrdiff_t ssizeof(T&& expression = {})
{
    return static_cast<std::ptrdiff_t>(sizeof(T));
}

int main()
{
    {
        int a[10];

        std::cout << "ssizeof<int>() = " << ssizeof<int>() << std::endl;
        std::cout << "ssizeof<int[3]>() = " << ssizeof<int[3]>() << std::endl;
        std::cout << "ssizeof<int[3]>() = " << ssizeof(a) << " / " << (sizeof a) << std::endl;
    }

    {
        int a;
        int b = 4;

        std::cout << "ssizeof<int[3]>() = " << ssizeof(a) << " / " << sizeof(a) << std::endl;
    }

    std::cout << "Done...";

    std::getchar();

    return EXIT_SUCCESS;
}

关于c++ - 内联函数,它等于 “sizeof expression”,但是返回一个带符号的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47776971/

相关文章:

使用模板元编程的 C++ 数值解析器

c++ - Pic 显示循环在 5 和 0 之间

c++ - 具有三向比较谓词的 STL 函数

c++ - RDP 动态虚拟 channel - 创建多个监听器

C++ 引用和枚举?

c++ - 为什么 iostream 对象不重载 operator bool?

C++ 加载文件

c++ - 继承成员函数指针

c++ - -D_GLIBCXX_USE_CXX11_ABI=1 对 CentOS 7 上的 devtoolset-7 无效

c++ - 关于 vector.push_back