我目前正在编写一个使用 C++20 的库std::span
。编译器库支持std::span
在这一点上相当稀缺。因此,我有一个允许使用第 3 方实现的 marco(在我的情况下tcb::span
)。宏如下所示:
#ifdef SPAN_BUILTIN
# include <span>
# define SPAN std::span
#else
# include "3rdparty/span.hpp"
# define SPAN tcb::span
#endif
通过库的用法如下所示:
void my_func(const SPAN<int>& s);
这一点都不漂亮。我一直在寻找更好的解决方案,但我遇到了std::conditional
我过去已经使用过的解决方案。一个天真的尝试看起来像这样:
constexpr const bool span_builtin = // ...
template <class T>
using span_type = typename std::conditional<span_builtin, std::span<T>, tcb::span<T>>::type;
这将导致这样的用法:
void my_func(const span_type& s);
问题在于std::span
编译时未知类型std::span
不可用,导致编译失败。
有更好的解决方案吗?