gpt4 book ai didi

c++ - 只接受文字整数的函数

转载 作者:IT老高 更新时间:2023-10-28 21:37:50 25 4
gpt4 key购买 nike

我正在寻找一种方法来模拟 C++ 中某些重载的 GCC 内置函数。内置函数类似于:

__builtin_foo(char *a, signed int b);
__builtin_foo(short *a, signed int b);
__builtin_foo(long *a, signed int b);

在 GCC 中硬编码有一个特殊限制:b 必须是文字值,即您可以调用:

__builtin_foo((char *)0, 1);

但不是:

extern int val;
__builtin_foo((char *)0, val);

这会产生编译器错误。我摆弄了 std::enable_if 来模拟这一点,但找不到强制只接受文字参数的方法。有没有办法做到这一点?

最佳答案

这是一个可移植的 C++11 解决方案,因此您的函数(实际上是宏,抱歉)只接受整数文字并触发编译时错误:

constexpr int operator "" _literal(unsigned long long i)
{
return i;
}

#define m_builtin_foo(integer) builtin_foo(integer ## _literal)

用户定义的文字只接受文字(因此得名)。因此,如果您让宏将用户定义的文字粘贴到传递给它的内容中,它应该只接受相应的用户定义的文字所接受的文字。

但是,这相当难看,我想这可能容易出错。不知道如何。


@MichaelAnderson 在评论中指出 m_builtin_foo(i+1) 仍然有效。这是正确的。 @Angew 建议将 _literal 的返回类型包装在与整数运算不兼容的包装器中,并添加显式转换。他也是对的,这里是更完整的解决方案:

struct wrapper
{
constexpr wrapper(int n):
value{n}
{}

explicit constexpr operator int() const
{
return value;
}

int value;
};

constexpr wrapper operator "" _literal(unsigned long long i)
{
return { int(i) };
}

#define m_builtin_foo(integer) builtin_foo(int(integer ## _literal))

关于c++ - 只接受文字整数的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29008059/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com