C++ 我可以用constexpr或模板替换此宏吗?

C++ 我可以用constexpr或模板替换此宏吗?,c++,templates,macros,constexpr,raii,C++,Templates,Macros,Constexpr,Raii,我有一个宏,在我正常编译程序时声明RAII互斥体,或者在我以单线程模式编译时跳过它以提高效率,我将单线程模式设置为1。显然,我不希望尽可能多地使用宏。我使用的是C++20G++-有没有办法重构这样一个宏来使用constexpr或模板而不是define 我目前的做法是: #ifdef SINGLE_THREADED #define READ_LOCK(name, mutex) ({}) #else #define READ_LOCK(name, mutex) folly::SharedMutex:

我有一个宏,在我正常编译程序时声明RAII互斥体,或者在我以单线程模式编译时跳过它以提高效率,我将单线程模式设置为1。显然,我不希望尽可能多地使用宏。我使用的是C++20G++-有没有办法重构这样一个宏来使用constexpr或模板而不是define

我目前的做法是:

#ifdef SINGLE_THREADED
#define READ_LOCK(name, mutex) ({})
#else
#define READ_LOCK(name, mutex) folly::SharedMutex::ReadHolder name(mutex);
#endif
我在代码中使用它,如:

void foo() {
  READ_LOCK(lg, my_mutex);
  // ....
}

您可以定义一个类来锁定互斥锁,并使其在单线程模式下不运行。这将在每次调用函数时假设类未优化,但与锁定互斥锁相比,函数调用所花费的时间是可忽略的

class Lock {
public:
#ifdef SINGLE_THREADED
    Lock(mutex&) {}
#else
    Lock(mutex& m) : m_(m) {
        m_.lock();
    }
    ~Lock() {
        m_.unlock();
    }
private:
    mutex& m_;  
#endif
};

void foo() {
    Lock lg(my_mutex);
    // ...
}

您可以定义一个类来锁定互斥锁,并使其在单线程模式下不运行。这将在每次调用函数时假设类未优化,但与锁定互斥锁相比,函数调用所花费的时间是可忽略的

class Lock {
public:
#ifdef SINGLE_THREADED
    Lock(mutex&) {}
#else
    Lock(mutex& m) : m_(m) {
        m_.lock();
    }
    ~Lock() {
        m_.unlock();
    }
private:
    mutex& m_;  
#endif
};

void foo() {
    Lock lg(my_mutex);
    // ...
}
你可以用一个constexpr变量,当某个东西是constexpr时,我们真的可以说变量吗?要在两种实现之间进行选择,请执行以下操作:

包括 静态constexpr bool单线程=false; 结构互斥{ void lock{std::cout您可以使用constexpr变量,我们真的可以在constexpr时说variable吗?在两种实现之间进行选择:

包括 静态constexpr bool单线程=false; 结构互斥{
空锁{std::你可以让构建系统在两个要提供的头文件之间进行选择吗?相同的类型名称,不同的实现。当它们有条件地复制到构建目录树中的某个子目录并添加到包含路径中时,这不需要任何宏或constexpr计算。不过,这的确很无聊,而且也不需要我恐怕不能直接回答这个问题……我认为使用宏是一种很好的编码方式,宏不一定是坏事,它们只是经常被ppl以坏的方式使用。ppl从……至少可以说,不是最前沿的人那里学到的东西,但在你的情况下,我认为这是一种有效的用法。宏的空变体{}是非标准的,我会使用类似do{}虽然为false。@Bktero-这不是标准的官方方式。相反,我们只是提出符合标准的编译器必须支持的方式,从而提高可移植性。您可以让生成系统在提供的两个标头之间进行选择。相同的类型名,不同的实现。当它们有条件地复制到某个子目录中时在构建目录树中添加y并添加到include路径中,这不需要任何宏或constexpr计算。虽然它的确很无聊,但恐怕也不能直接回答问题……我认为使用宏是一种很好的编码方式,宏不一定是坏事,只是学习的ppl经常以不好的方式使用它们ned从一个不在最前沿的人那里,至少可以说,但在你的情况下,我认为这是一个有效的用法。宏{}的空变量是非标准的,我会使用类似do{}虽然是错误的。@Bktero-不是像这样的标准是官方的方式。相反,我们只是提出了符合标准的编译器必须支持的方式,从而提高了可移植性。