我很好奇是否有可能在编译时确保在一个地方调用一个方法。
请注意,如果函数被调用多次(例如在一个循环中)是可以的 - 但它不应该在两个单独的循环中调用。
这可以分为两部分,我也对涵盖任一部分的解决方案感兴趣:
(a) 确保至少在一个地方
调用一个方法 (b) 确保一个方法最多在一个地方调用
我可以完全控制代码的结构,欢迎使用实现相同想法的不同习语。
// class.h
class MyClass {
public:
void my_method();
}
Run Code Online (Sandbox Code Playgroud)
以下不应编译(从未调用)
#include "class.h"
int main() {
MyClass my_class;
}
Run Code Online (Sandbox Code Playgroud)
以下不应编译(在多个地方调用)
#include "class.h"
int main() {
MyClass my_class;
my_class.my_method();
while(true) {
my_class.my_method();
}
}
Run Code Online (Sandbox Code Playgroud)
以下应该编译(在一个地方调用):
#include "class.h"
int main() {
MyClass my_class;
while(true) {
my_class.my_method();
}
}
Run Code Online (Sandbox Code Playgroud) 我有几个命名空间,每个命名空间都具有相同的函数名称集:
namespace one {
void a();
void b();
void c();
}
namespace two {
void a();
void b();
void c();
}
namespace three {
void a();
void b();
void c();
}
Run Code Online (Sandbox Code Playgroud)
有没有一种很好的方法可以重构以下代码以避免重复?
one::a();
two::a();
three::a();
one::b();
two::b();
three::b();
while(true) {
one::c();
two::c();
three::c();
}
Run Code Online (Sandbox Code Playgroud)
例如,在伪代码中,有没有一种方法可以表达
for (name: {one, two, three}) {
name::a();
}
Run Code Online (Sandbox Code Playgroud)
干净吗?
如果有更惯用的方式来表达相同的想法,我也可以重写/重组函数定义。
使用 gcc 10.1 和 boost 1.73.0,以下代码
#include <boost/bimap.hpp>
int main() {
boost::bimap<int, int> lookup;
}
Run Code Online (Sandbox Code Playgroud)
使用 flags 编译失败-O2 --std=c++20,但使用 flags会成功-O2 -std=c++17(使用编译器资源管理器验证)。
这可能与以下问题有关:https : //github.com/boostorg/bimap/pull/15(已弃用std::allocator<void>)
我现在可以使用一些解决方法来使此代码成功编译--std=c++20吗?
我想定义的类成员a,b利用结构化的绑定,在类似如下的方式:
struct AB {
int a;
int b;
};
class MyClass {
public:
MyClass(AB ab) : ab{ab} {}
private:
AB ab;
const auto [a, b] = ab;
}
Run Code Online (Sandbox Code Playgroud)
但是,使用 gcc 9.2.0 这会导致编译器错误:
error: expected unqualified-id before ‘[’ token
12 | const auto [a, b] = ab;
Run Code Online (Sandbox Code Playgroud)
有什么方法可以用结构化绑定重写它以便编译吗?或者我必须放弃使用结构化绑定并分别定义每个成员:
const int a = ab.a;
const int b = ab.b;
Run Code Online (Sandbox Code Playgroud)