【问题标题】:Variadic template calling assert()可变参数模板调用 assert()
【发布时间】:2022-01-15 21:02:52
【问题描述】:

我有这个代码:

#ifdef _DEBUG
#define MY_VERY_SPECIAL_ASSERT(x, ...) assert(x && __VA_ARGS__)
#else
#define MY_VERY_SPECIAL_ASSERT(x, ...)
#endif

这正是它应该做的。但是,为了永远继续学习,我正在努力遵守 core-cpp 集中的constexpr variadic 模板指南。

我已经尝试了一些排列,但这个似乎是最“正确”的

#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”和字符串没有逻辑和重载,这是有道理的。你会认为它总是返回 true,对吧?

无论如何,如果有人在这里有任何指示,我很高兴了解有关模板的更多信息。 =)

【问题讨论】:

  • 不知道代码应该做什么!是否要检查条件并中止执行但之前输出消息?
  • 就是这样。我见过assert([test] &amp;&amp; "msg") 经常使用。

标签: c++ templates assert


【解决方案1】:

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." );

【讨论】:

  • 壮观。谢谢。
猜你喜欢
  • 2021-10-01
  • 2016-12-01
  • 1970-01-01
  • 2012-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多