可变参数模板调用 assert()
Variadic template calling assert()
我有这个代码:
#ifdef _DEBUG
#define MY_VERY_SPECIAL_ASSERT(x, ...) assert(x && __VA_ARGS__)
#else
#define MY_VERY_SPECIAL_ASSERT(x, ...)
#endif
这正是它应该做的。但是,为了永远继续学习,我正在努力遵守来自 core-cpp 集的 constexpr
可变参数模板指南。
我尝试了一些排列,但这个似乎是最“正确”的
#ifdef _DEBUG
template<typename T>
constexpr void MY_VERY_SPECIAL_ASSERT(T x, const std::string &msg) {
assert(x && msg);
}
#else
template<typename T>
constexpr void MY_VERY_SPECIAL_ASSERT(T x, const std::string &msg) { }
#endif
当然,它不想编译。具体来说,“T”和字符串没有逻辑与重载,这是有道理的。你会认为它总是 return 正确,对吧?
无论如何,如果有人在这里有任何指示,我很乐意了解更多关于模板的信息。 =)
T
是一个bool
,即它是表达式E1
和
求值的结果
static_cast<decltype (E1)> (false) != E1;
您收到错误消息是因为 std::string
没有隐式转换为 bool
。
constexpr void MY_VERY_SPECIAL_ASSERT(T x, const std::string &msg) {
// assert(x && static_cast<bool>(msg)); // won't work
assert(x && msg.empty()); // Should work. The string won't be displayed when an assertion fails, though.
}
但是无论如何,这不会像人们想象的那样。
assert(x && msg);
将始终导致显示消息“断言失败:x && msg”。
您可以改用它:
assert ( false or !"message" );
#ifndef _DEBUG
# define SPECIAL_ASSERT(...) ()
#else
# define SPECIAL_ASSERT(COND, MSG) (assert(COND or! MSG))
#endif
SPECIAL_ASSERT( 1 == 0, "One isn't zero." );
我有这个代码:
#ifdef _DEBUG
#define MY_VERY_SPECIAL_ASSERT(x, ...) assert(x && __VA_ARGS__)
#else
#define MY_VERY_SPECIAL_ASSERT(x, ...)
#endif
这正是它应该做的。但是,为了永远继续学习,我正在努力遵守来自 core-cpp 集的 constexpr
可变参数模板指南。
我尝试了一些排列,但这个似乎是最“正确”的
#ifdef _DEBUG
template<typename T>
constexpr void MY_VERY_SPECIAL_ASSERT(T x, const std::string &msg) {
assert(x && msg);
}
#else
template<typename T>
constexpr void MY_VERY_SPECIAL_ASSERT(T x, const std::string &msg) { }
#endif
当然,它不想编译。具体来说,“T”和字符串没有逻辑与重载,这是有道理的。你会认为它总是 return 正确,对吧?
无论如何,如果有人在这里有任何指示,我很乐意了解更多关于模板的信息。 =)
T
是一个bool
,即它是表达式E1
和
static_cast<decltype (E1)> (false) != E1;
您收到错误消息是因为 std::string
没有隐式转换为 bool
。
constexpr void MY_VERY_SPECIAL_ASSERT(T x, const std::string &msg) {
// assert(x && static_cast<bool>(msg)); // won't work
assert(x && msg.empty()); // Should work. The string won't be displayed when an assertion fails, though.
}
但是无论如何,这不会像人们想象的那样。
assert(x && msg);
将始终导致显示消息“断言失败:x && msg”。 您可以改用它:
assert ( false or !"message" );
#ifndef _DEBUG
# define SPECIAL_ASSERT(...) ()
#else
# define SPECIAL_ASSERT(COND, MSG) (assert(COND or! MSG))
#endif
SPECIAL_ASSERT( 1 == 0, "One isn't zero." );