C++ 将任何容器定义为c样式的数组视图

C++ 将任何容器定义为c样式的数组视图,c++,c++14,sfinae,typetraits,array-view,C++,C++14,Sfinae,Typetraits,Array View,我正在创建一个简单的、不属于自己的数组视图类: template <typename T> class array_view { T* data_; size_t len_; // ... }; 这似乎完全不令人满意,我甚至不确定它是否正确。我是否正确地包括了所有正确的容器,并排除了所有错误的容器?有没有更简单的方法来编写此要求 如果我们查看中提出的std::experimental::array_view,我们会在表104中找到以下可查看的要求: Expr

我正在创建一个简单的、不属于自己的数组视图类:

template <typename T>
class array_view {
    T* data_;
    size_t len_;
    // ...
};

这似乎完全不令人满意,我甚至不确定它是否正确。我是否正确地包括了所有正确的容器,并排除了所有错误的容器?有没有更简单的方法来编写此要求

如果我们查看中提出的
std::experimental::array_view
,我们会在表104中找到以下
可查看的
要求:

Expression Return type Operational semantics v.size() Convertible to ptrdiff_t v.data() Type T* such that T* is static_cast(v.data()) points to a implicitly convertible to U*, contiguous sequence of at least and is_same_v<remove_cv_t<T>, v.size() objects of (possibly remove_cv_t<U>> is true. cv-qualified) type remove_cv_t<U>.
是的,这不符合类型函数的常规技术,但它较短,您可以理解。

@dyp是的,回想起来,它没有任何意义,让我把它去掉。那么,它与建议的
数组视图
有什么关系?例如(不确定这是否是当前版本)。你想让我们批评那篇论文,还是把你的方法和他们的比较?@dyp从未听说过那篇论文,所以。。。我不知道。不管你想回答什么:)@dyp对了,我对
字符串
(至少可以做
数组视图
)已经半途而废,对
初始值设定项列表
已经完全崩溃了。我猜一个真正的过载想法不会成功。我认为你不会因为
string
而崩溃。如果某个函数定义了一个接口
void f(array\u view)
,则不能使用
字符串。不确定为什么
初始值设定项\u列表
没有
数据
成员。不确定你期望的是什么,巴里。我猜你已经找到了所有这些信息。但我不认为支票的非概念版本短得多。是的,我想我希望我遗漏了什么。我确实喜欢将支票放入constexpr函数中的想法。 Expression Return type Operational semantics v.size() Convertible to ptrdiff_t v.data() Type T* such that T* is static_cast(v.data()) points to a implicitly convertible to U*, contiguous sequence of at least and is_same_v<remove_cv_t<T>, v.size() objects of (possibly remove_cv_t<U>> is true. cv-qualified) type remove_cv_t<U>.
template<typename T, typename As,
         typename size_rt = decltype(std::declval<T>().size())
         typename data_rt = decltype(std::declval<T>().data())>
constexpr bool is_viewable =
    std::is_convertible_v<size_rt, std::ptrdiff_t>
    && std::is_convertible_v<data_rt, T*>
    && std::is_same_v<std::remove_cv_t<T>, std::remove_cv_t<data_rt>>;

template <typename C,
          typename = std::enable_if_t<is_viewable<C, T>>
         >
array_view(C&& container)
    : data_(container.data()), len_(container.size())
{ }