如何将模板添加到 static_assert 中?

dro*_*del 0 c++ c++14

考虑以下代码:

#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 中获取模板?

Yak*_*ont 5

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>