我正在制作一个简单的、非拥有的数组视图类:
template <typename T>
class array_view {
T* data_;
size_t len_;
// ...
};
我想从具有data()
和size()
成员函数的任何容器构造它,但是 SFINAE-d 正确,只有在它是有效且安全的行为才能实际遍历array_view
的情况下才能从某个容器构造。C
data_
我去了:
template <typename C,
typename D = decltype(std::declval<C>().data()),
typename = std::enable_if_t<
std::is_convertible<D, T*>::value &&
std::is_same<std::remove_cv_t<T>,
std::remove_cv_t<std::remove_pointer_t<D>>>::value>
>
array_view(C&& container)
: data_(container.data()), len_(container.size())
{ }
这似乎完全不令人满意,我什至不确定它是否正确。我是否正确地包括了所有正确的容器并排除了所有错误的容器?有没有更简单的方法来编写这个要求?