考虑以下代码:
#include <iterator>
struct Node {
static Node mNode;
};
Node Node::mNode;
struct DeepNodeRange {};
template<class T>
class DeepNodeIter
{
public:
using iterator_category = std::forward_iterator_tag;
using value_type = Node*;
using difference_type = std::ptrdiff_t;
DeepNodeIter() = default;
DeepNodeIter(DeepNodeRange& deepNodeRange, bool end = false) :
mDeepNodeRange(&deepNodeRange), mEnd(end) {}
auto operator*() const { return &Node::mNode; }
auto& operator++()
{
mIdx++;
mEnd = (mIdx > 10);
return *this;
}
auto operator++([[maybe_unused]] int val)
{
auto tmp(*this);
operator++();
return tmp;
return tmp;
}
auto operator==(const DeepNodeIter& iter) const
{ return iter.mEnd == mEnd; }
protected:
DeepNodeRange* mDeepNodeRange;
int mIdx;
bool mEnd;
};
template<class T>
static_assert(std::forward_iterator<DeepNodeIter<T>>);
int main() {
}
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
b.cpp:54:1: error: expected unqualified-id before 'static_assert'
54 | static_assert(std::forward_iterator<DeepNodeIter<T>>);
| ^~~~~~~~~~~~~
./b.out: Command not found.
Run Code Online (Sandbox Code Playgroud)
我之前在类定义中有 static_assert 但它失败了,因为无法推断返回类型来验证断言。现在它在外面,我缺少断言工作所需的模板定义。有没有办法在 static_assert 中获取模板?
C++ 模板是图灵完备的。的完整描述Foo<T>可以涉及一般情况下的几乎任意计算。
你的断言似乎想要断言一切都一致正确Foo<T>;这在模板类型替换的一般情况下被证明是不可能的。
通常,C++ 只允许您Foo<T>在特定的狭窄情况下反转 隐含的映射,并且不允许您对其进行通用限定。
TL;DR 将静态断言放入类型工厂中。
template<class T>
class DeepNodeIter{
class DeepNodeIterImpl{ // implement
};
public:
using type=DeepNodeIterImpl;
static_assert(/* blah */);
};
template<class T>
using DeepNodeIter_t=typename DeepNodeIter<T>::type;
Run Code Online (Sandbox Code Playgroud)
这将保证每次实例化一个静态断言DeepNodeIter_t<x>。
| 归档时间: |
|
| 查看次数: |
135 次 |
| 最近记录: |