微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

类型未知的std :: conditional

如何解决类型未知的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::spanstd::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
}

另请参阅Proper way to define type (typedef vs #define)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?