我习惯了这个:
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__)最糟糕的.
那么,有什么建议吗?
由于概念检查递归,我无法在 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) 我有一个经常出现的问题,我找不到一个优雅的解决方案来避免资源清理代码重复:
resource allocation:
try {
f()
} catch (...) {
resource cleaning code;
throw;
}
resource cleaning code;
return rc;
Run Code Online (Sandbox Code Playgroud)
所以,我知道我可以用清理析构函数做一个临时类,但我不喜欢它,因为它打破了代码流,我需要给类引用所有堆栈变量进行清理,同样的问题与一个函数,我不知道如何不存在这个反复出现问题的优雅解决方案.