有没有办法阻止在C++代码的某些部分调用特定函数

Ly *_*Tai 2 c++ c++11 c++14

我目前正在致力于实现一个模块,该模块由三个函数组成,包括Init()Process()Release()。我想找到一种在使用std::vector::push_backinProcess()Release()函数时抛出编译错误的方法。有什么可行的办法吗?谢谢大家!

class AModule {
 private:
  std::vector<std::int32_t> vector_list;

 public:
  bool Init() override {
    vector_list.push_back(10); // Allow to use push_back function only in Init state
  }
  void Process() override {
    vector_list.push_back(10); // Should throw compile error here
  }
  void Release() override {
    vector_list.push_back(10); // Should throw compile error here
  }
};
Run Code Online (Sandbox Code Playgroud)

我尝试static_assert通过包装向量类来使用,但它无法正常工作。

Mes*_*kon 5

如果您正在使用,GCC则可以poison在之后使用预处理器来处理某些标记pragma(请参阅此处)。如果您正在使用MSVC,那么您deprecated pragma至少可以使用 来获得警告(您可以通过提供正确的标志将其转变为编译错误)。

// Header file
#include <cstdint>
#include <vector>

class AModule {
private:
    std::vector<std::int32_t> vector_list;

public:
    bool Init();
    void Process();
    void Release();
};

// Source file
bool AModule::Init() {
    vector_list.push_back(10); // Allow to use push_back function only in Init state
    return true;
}

// If GCC (and probably clang) 
#pragma GCC poison push_back // Please do not use this in a header file
// If MSVC
#pragma deprecated(push_back)

void AModule::Process() {
    // vector_list.push_back(10); // compile error here
}

void AModule::Release() {
    // vector_list.push_back(10); // compile error here
}
Run Code Online (Sandbox Code Playgroud)

  • 错误的解决方案:将 `poison` `pragma` 放在基类头中。实际答案:不,当我从你的基类派生时,你尝试做的任何事情来阻止我将“push_back”放入我自己的“向量”中,我都可以轻松规避。如果“vector”是基类的一部分,那么您可以将“Process”函数设置为“const”。 (2认同)