如何解决类型未知的std :: conditional
我当前正在编写一个使用C ++ 20的std::span
的库。在这一点上,对std::span
的编译器库支持非常稀缺。因此,我有一个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
不可用的情况下在编译时是未知类型,从而导致编译失败。
有更好的解决方案吗?
解决方法
很好的问题!
让我们一步一步地回答
constexpr const bool span_builtin = // ...
这样的东西存在吗?
这项工作可以吗?
可能不是
https://stackoverflow.com/a/45594334/1691072
我们可以使用它,但是问题是在C ++ 20以下,将无法定义Span
Also we cannot officially add our own span Forward Declaration to std namespace
那有什么解决方案?
最终解决方案将与您的解决方案非常相似
#include <type_traits>
#if __cplusplus > 201703L // Do something else for MSVC if you cannot use `/Zc:__cplusplus`
#include <span>
template<typename T,std::size_t N = std::dynamic_extent>
using span = std::span<T,N>;
#else
template<typename T>
using span = tcb::span<T>;
#endif
int main ()
{
#if __cplusplus > 201703L
static_assert(std::is_same_v< span<int>,std::span<int>>);
#else
static_assert(std::is_same_v< span<int>,tcb::span<int>>);
#endif
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。