小编yoy*_*yoy的帖子

确保在编译时只在一个地方调用方法

我很好奇是否有可能在编译时确保在一个地方调用一个方法。

请注意,如果函数被调用多次(例如在一个循环中)是可以的 - 但它不应该在两个单独的循环中调用。

这可以分为两部分,我也对涵盖任一部分的解决方案感兴趣:
(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)

c++

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

在命名空间列表中调用具有相同名称的函数

我有几个命名空间,每个命名空间都具有相同的函数名称集:

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)

干净吗?

如果有更惯用的方式来表达相同的想法,我也可以重写/重组函数定义。

c++

7
推荐指数
2
解决办法
143
查看次数

Boost bimap 无法使用 gcc 10、c++20 进行编译。寻找临时修复

使用 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吗?

c++ boost c++20 gcc10

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

使用结构化绑定定义类成员

我想定义的类成员ab利用结构化的绑定,在类似如下的方式:

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)

c++

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

标签 统计

c++ ×4

boost ×1

c++20 ×1

gcc10 ×1