小编Nic*_*oni的帖子

将调用者__FILE__ __LINE__传递给函数而不使用宏

我习惯了这个:

class Db {
  _Commit(char *file, int line) {
    Log("Commit called from %s:%d", file, line);
  }
};

#define Commit() _Commit(__FILE__, __LINE__)
Run Code Online (Sandbox Code Playgroud)

但最大的问题是我重新定义了Commit全局这个词,而在一个400k行的应用程序框架中,这是一个问题.而且我不想使用像这样的特定词DbCommit:我不喜欢冗余db->DbCommit(),或者在任何地方手动传递值:db->Commit(__FILE__, __LINE__)最糟糕的.

那么,有什么建议吗?

c++ c-preprocessor

22
推荐指数
2
解决办法
8580
查看次数

是否可以强制概念有效以避免 std::variant 递归概念检查错误?

由于概念检查递归,我无法在 clang++16 上编译以前的工作代码。编译器给我以下错误:

错误:满足约束 'requires { { __t < __u } -> __boolean_testable; { __u < __t } -> __boolean_testable; }' 取决于它自己

这是复制错误的最小代码,适用于以前的版本:

#include <vector>
#include <variant>
#include <iostream>

struct var;
typedef std::vector<var> var_vector;
typedef std::variant<int, var_vector> var_base_type;

struct var : public var_base_type {
  using var_base_type::var_base_type;
  bool operator<(const var &to) const {
    if (index() != to.index())
      return index() < to.index();
    if (holds_alternative<int>(*this))
      return get<int>(*this) < get<int>(to);
    if (holds_alternative<var_vector>(*this))
      return get<var_vector>(*this) < get<var_vector>(to);
    return false;
  }
};

int main() {
  std::cout …
Run Code Online (Sandbox Code Playgroud)

c++ c++-concepts c++20

6
推荐指数
0
解决办法
94
查看次数

异常处理中的冗余代码

我有一个经常出现的问题,我找不到一个优雅的解决方案来避免资源清理代码重复:

resource allocation:

try {
  f()
} catch (...) {
  resource cleaning code;
  throw;
}

resource cleaning code;
return rc;
Run Code Online (Sandbox Code Playgroud)

所以,我知道我可以用清理析构函数做一个临时类,但我不喜欢它,因为它打破了代码流,我需要给类引用所有堆栈变量进行清理,同样的问题与一个函数,我不知道如何不存在这个反复出现问题的优雅解决方案.

c++

1
推荐指数
1
解决办法
313
查看次数

标签 统计

c++ ×3

c++-concepts ×1

c++20 ×1

c-preprocessor ×1