类型未知的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)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...