nn0*_*n0p 5 c++ templates metaprogramming boost-python
下面是 Boost.Python源代码的一个片段:
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;
}
Run Code Online (Sandbox Code Playgroud)
可以确定的是,前向声明的 struct 没有定义null_ok,并且null_ok与模板参数无关T。
在Python wiki 中,给出了一些提示:
handle<> y(null_ok(x))允许 y 变为 NULL
handle<> y(x),其中 x 不是 null_ok 的结果,永远不会导致 NULL y。如果 x 为 NULL 将抛出异常
我无法弄清楚结构模板的声明(没有定义)如何null_ok达到上述目的?
关键是在指针本身的类型中编码“这个指针可以为空”以及原始类型。
然后,接受指针的函数模板可以被重载以识别null_ok<T>*指针,并且不会在空指针上出错(同时将其转换回 a T*)。
您不需要 的定义null_ok,因为您可以拥有指向不完整类型的指针,并且它可以防止人们意外地编写类似null_ok<int> a;.
| 归档时间: |
|
| 查看次数: |
160 次 |
| 最近记录: |