【发布时间】:2019-02-22 01:21:36
【问题描述】:
我想创建使用标准 C++ 中的“可选”的标头。 但是,我的标头将引用自 Visual Studio 2015 以及 Visual Studio 2017 项目。
我想要一些东西,例如对于 Visual Studio 2017(带有 C++ 17 语言功能集),使用 std::optional 并且对于 Visual Studio 2015,使用 boost::optional。
我在想这样的事情:
#include <yvals.h>
#if _HAS_CXX17
#include <optional>
template <typename T> using Optional = std::optional<T>;
#else
#include "boost/optional/optional.hpp"
template <typename T> using Optional = boost::optional<T>;
#endif
这样使用'_HAS_CXX17'宏可以吗? 有更好的方法吗?
【问题讨论】:
-
考虑使用
__has_include(<optional>)和__has_include(<experimental/optional>)(en.cppreference.com/w/cpp/preprocessor/include)。一些编译器/标准库在使用实际标准之前提供库功能。 -
@Justin 考虑到
__has_include是在 C++17 中添加的,使用它来检测特定的 C++17 功能听起来有问题。 -
@Sneftel 不完全是。你做一个
#ifdef __has_include,然后正常使用__has_include
标签: c++ visual-studio-2017 boost-optional stdoptional