没有定义的结构模板的目的是什么?

What is the purpose of a struct template without definition?

以下是 Boost.Python 的 source code 的片段:

template <class T> struct null_ok; // how's it working?

template <class T>
inline null_ok<T>* allow_null(T* p)
{
    return (null_ok<T>*)p;
}

前向声明的结构 null_ok 没有定义,并且 null_ok 与模板参数 T.

无关

Python wiki 中给出的一些提示:

handle<> y(null_ok(x)) allows y to become NULL

handle<> y(x), where x is not the result of null_ok, never results in a NULL y. An exception will be thrown if x is NULL

我想不通结构模板的声明(没有定义)null_ok 是如何实现上述目的的?

与您代码段下方 handle.hpp 中的代码完全一致(评论我的):

// this is a borrowed handle which can be null,
// so increment refcount if p is not null
// (xincref just does nothing in this case)
template <class T>
inline T* manage_ptr(detail::borrowed<null_ok<T> >* p, int)
{
  return python::xincref((T*)p);
}

// the same - as stated in the doc, null_ok and borrowed are commutative
template <class T>
inline T* manage_ptr(null_ok<detail::borrowed<T> >* p, int)
{
  return python::xincref((T*)p);
}


// this is a borrowed handle which cannot be null, so make sure p is not null
// and increment refcount.
template <class T>
inline T* manage_ptr(detail::borrowed<T>* p, long)
{
  return python::incref(expect_non_null((T*)p));
}

// p is not borrowed and can be null - do nothing.
template <class T>
inline T* manage_ptr(null_ok<T>* p, long)
{
  return (T*)p;
}

// p is not borrowed and cannot be null - make sure it isn't null indeed.
template <class T>
inline T* manage_ptr(T* p, ...)
{
  return expect_non_null(p);
}

null_ok<T> 不必为了编译此代码而完成,因此它只是声明,而不是定义。完成它只会给编译器增加额外的工作。

重点是将 "it's ok for this pointer to be null" 与原始类型一起编码为指针本身的类型。

然后,可以重载接受指针的函数模板以识别 null_ok<T>* 指针,并且不会在空指针上出错(同时将其转换回 T*)。

你不需要 null_ok 的定义,因为你可以有指向不完整类型的指针,它可以防止人们不小心写出 null_ok<int> a;.

这样的东西