Sam*_*m G 3 c++ templates template-meta-programming constexpr c++17
我有兴趣为个人项目创建一个非常小的constexpr容器。我需要的最重要的事情是带有真正constexpr迭代器的容器。它们最终将被添加到标准中(http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p0858r0.html),但是我想知道如何在当前的C ++。
假设我有一个像这样的数据结构:
template <typename T, unsigned N>
struct array {
const T data[N];
template<typename... Args>
constexpr array(const Args&... args) : data{args...} {
}
struct array_iterator {
T const* ptr;
constexpr array_iterator(const T* ptr) : ptr(ptr) {}
constexpr void operator++() { ++ptr; }
constexpr void operator--() { --ptr; }
constexpr T const& operator* () const { return *ptr; }
constexpr bool operator==(const array_iterator& rhs) const { return *(*this) == *rhs; }
constexpr bool operator!=(const array_iterator& rhs) const { return !(*this == rhs); }
};
constexpr array_iterator begin() const { return array_iterator(data); }
constexpr array_iterator end() const { return array_iterator(data + N); }
};
Run Code Online (Sandbox Code Playgroud)
我需要的是能够在constexpr上下文中实际使用迭代器:
constexpr array<int, 3> arr(1, 2, 3);
constexpr auto it = arr.begin();
Run Code Online (Sandbox Code Playgroud)
但是显然,由于我在弄混非constexpr ptr子对象,因此遇到如下错误:
iterator.cpp:46:18: error: constexpr variable 'it' must be initialized by a
constant expression
constexpr auto it = arr.begin();
^ ~~~~~~~~~~~
iterator.cpp:46:18: note: pointer to subobject of 'arr' is not a constant
expression
iterator.cpp:45:27: note: declared here
constexpr array<int, 3> arr(1, 2, 3);
^
Run Code Online (Sandbox Code Playgroud)
那么,像数组这样的容器的最小constexpr迭代器是什么?
constexpr 有一些含义。
它可以表示始终可以在编译时计算的值。它可以表示一个函数,给定编译时参数,可以生成可以在编译时计算的输出。
您发现迭代器无法引用自动存储constexpr对象。另一方面,它们可以在函数中调用constexpr。
template <typename T, unsigned N>
struct array {
const T data[N];
template<typename... Args>
constexpr array(const Args&... args) : data{args...} {}
struct array_iterator {
T const* ptr;
constexpr array_iterator(const T* ptr) : ptr(ptr) {}
constexpr void operator++() { ++ptr; }
constexpr void operator--() { --ptr; }
constexpr T const& operator* () const { return *ptr; }
constexpr bool operator==(const array_iterator& rhs) const { return ptr == rhs.ptr; }
constexpr bool operator!=(const array_iterator& rhs) const { return !(*this == rhs); }
};
constexpr array_iterator begin() const { return array_iterator(data); }
constexpr array_iterator end() const { return array_iterator(data + N); }
};
constexpr int sum() {
int retval = 0;
constexpr array<int, 3> arr = {1,2,3};
for (int x : arr)
retval += x;
return retval;
}
int main() {
array<int, sum()> test;
(void)test;
}
Run Code Online (Sandbox Code Playgroud)
您operator==已损坏,但是在修复它之后,我们可以sum()在constexpr上下文中调用,而上下文又使用迭代器。
| 归档时间: |
|
| 查看次数: |
416 次 |
| 最近记录: |