gpt4 book ai didi

c++ - 在宏中使用 static_assert

转载 作者:行者123 更新时间:2023-11-30 01:19:06 25 4
gpt4 key购买 nike

我有这样的情况:

#define FOO(Readonly) static_assert(Readonly, "Fire!");

Readonly 显然会按字面意思粘贴为“false”或“true”,因此 static_assert 将始终触发。我如何编写条件代替 Readonly 以便 static_assert 正常工作?


这是我的预期用途:

#define CAT(x, y) CAT_(x, y)
#define CAT_(x, y) x ## y
#define GET_SET(Name, Readonly) decltype(Name) CAT(get, Name)() const { return Name; } \
void CAT(set, Name)(decltype(Name) value = decltype(Name)()) { \
static_assert( /* Insert Magic bullet here */ , #Name " is read-only."); \
Name = value; \
}

class Test
{
int x;
int y;
public:
GET_SET(x, false)
GET_SET(y, true)
};

示例预处理器输出:

decltype(x) getx() const { return x; } void setx(decltype(x) value = decltype(x)()) { static_assert(!false, "x" " is read-only."); x = value; }
decltype(y) gety() const { return y; } void sety(decltype(y) value = decltype(y)()) { static_assert(!true, "y" " is read-only."); y = value; }

Live Example

最佳答案

宏指令

#define FOO(Readonly) static_assert(Readonly, "Fire!");

正如您正确推测的那样,会将传递给 Readonly 的值转发给 Readonly,因此

FOO(false)

会产生

static_assert(false, "Fire!");

请记住 static_assert 在条件为假时断言,这将始终触发。然而

FOO(true);
// generates
static_assert(true, "Fire!");

永远不会断言。

在你想要的输出中你写了:

decltype(x) getx() const { return x; } void setx(decltype(x) value = decltype(x)()) { static_assert(!false, "x" " is read-only."); x = value; }

看来您只是忘记了宏中 ReadOnly 前面的 !

static_assert 是一个编译时关键字,它是在编译时检查的,而不是运行时,所以除非有某种原因它在模板实例化之前无法解析(例如,它正在检查模板- 类型的成员变量或模板参数)那么它总是会在声明时失败。

以下代码似乎工作正常:

#define CAT(x, y) CAT_(x, y)

#define CAT_(x, y) x ## y

#define GET_SET(Name, Readonly) decltype(Name) CAT(get, Name)() const { return Name; } \
void CAT(set, Name)(decltype(Name) value = decltype(Name)()) { \
static_assert( !Readonly , #Name " is read-only."); \
Name = value; \
}

template<typename T>
class Foo
{
int x;
int y;
public:
Foo() : x(0), y(0) {}
GET_SET(x, false);
GET_SET(y, true);
};

http://ideone.com/BkRYBE

当然,除了它会拒绝坏的情况,因为我们使用了 static_assert 而不是运行时断言或抛出。但它会按照您所说的那样做。

关于c++ - 在宏中使用 static_assert,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21372638/

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