struct IntSlice {
int* ptr_;
int len_;
};
std::initializer_list<int> xs = {1, 2, 3};
const IntSlice s = {xs.begin(), (int)xs.size()}; // this does not work :(
这给了我一个错误,我们不能将常量指针分配给非常量指针,但我认为声明const IntSlice
会解决这个问题。
我想我知道发生了什么。const IntSlice
正在将int* ptr_
提升为int* const ptr_
,而不是我想要的const int* const ptr_
。
但是,肯定有某种方法可以在不创建ReadonlyIntSlice
的情况下将int* ptr_
提升为const int*
?
IntSlice
过于具体。它仅适用于(可变的(int
切片。为什么不拥有适用于任何类型切片的东西呢?
template <typename T>
struct Slice
{
T* ptr_;
std::size_t len_;
};
现在,您可以拥有Slice<int>
、Slice<const int>
、Slice<const * const double>
和其他任何您喜欢的东西。
std::initializer_list<int> xs = {1, 2, 3};
Slice<const int> s = {xs.begin(), xs.size()};
在C++17中,如果添加适当的构造函数或推导指南,则可以省略模板参数。
template <typename T>
Slice(T* ptr, std::size_t len) -> Slice<T>;
Slice s = {xs.begin(), xs.size()};