如果 `std::Optional` 存在,则有条件地编译函数

use*_*643 2 c++ c++14 c++17

我有一个混合的 C++14/C++17 代码库,并且我isEmpty只想在手头有一个函数时启用该函数std::optional。所以,我尝试了 SFINAE:

template <typename T, typename int_<decltype(std::nullopt)>::type = 0>
inline bool isEmpty(const std::optional<T>& v) {
  return !v;
}
Run Code Online (Sandbox Code Playgroud)

然而,这是行不通的。

isEmpty如果std::optional存在的话如何进行条件编译?

pao*_*olo 5

如果您的编译器足够新(例如 GCC >= 9.1 或 Clang >= 9.0.0),您可以包含头文件<version>并在定义了宏的情况下有条件地编译函数模板__cpp_lib_optional

#include <version> // provides, among others, __cpp_lib_optional

#ifdef __cpp_lib_optional
template <typename T>
inline bool isEmpty(const std::optional<T>& v) {
    return !v;
}
#endif
Run Code Online (Sandbox Code Playgroud)

这样,isEmpty只有在您处于模式(或更高模式)时才会编译-std=c++17