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())
{ }