【发布时间】:2021-01-08 00:02:48
【问题描述】:
我目前正在编写一个使用 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不可用导致编译失败。
有没有更好的解决方案?
【问题讨论】:
-
为什么不在
std命名空间中声明一个名为span的别名,编写简单引用std::span的代码,然后在更新编译器时删除别名?跨度> -
将
# define SPAN std::span更改为template <typename T> using span = std::span<T>;。同时对第三方库行进行相应的更改。 -
为什么不到处使用
tcb::span?这将节省大量的调试工作。 -
@SamVarshavchik:那将是未定义的行为,并破坏存在
std::span实现但尚未符合标准的编译器。