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++ - 视频游戏中的物理学,对角加速度施加扭矩

c++ - 使用C++进行行程解压缩

c# - 如何从非托管 C++ 代码获取结构化列表值到 C#?

c++ - 如何在 Eclipse CDT 中获取 C/C++ 程序的控制台输入

c++ - MFC:将CStringArray转换为 float ,只转换部分值

c++ - HTTP Server 3 示例中跨线程的 boost::asio 套接字共享

C++ TR1 正则表达式 - 多行选项

c++ - 从 C++ 库代码到 C 应用程序代码 : symbol lookup error

c++ - 来自 std::set insert() 和 find() 的写-写数据竞争?