提供“安全”的环境。与 auto_ptr 一起使用的 push() 函数
我想声明一个“安全”的 push()
函数,与 auto_ptr
一起使用,如下所示:
template<class StackType,typename T>
inline void push( StackType &s, auto_ptr<T> p ) {
s.push( p.get() );
p.release();
}
我也希望它适用于空指针,例如:
push( my_stack, 0 ); // push a null pointer
因此,有一个专门化:
template<class StackType>
inline void push( StackType &s, int p ) {
s.push( reinterpret_cast<typename StackType::value_type>( p ) );
}
虽然它可以工作,但它既丑陋又允许错误的代码,例如:
push( my_stack, 1 ); // ???
编译。
如何编写 push()
的特化,使其仅接受 0
作为有效的 int
值(对于空指针)?
要求
StackType
是一些我必须使用的类似堆栈的容器类,但我不能不使用其源代码> 更改(就像 std::stack 一样)。我可以假设它有一个push()
成员函数。我无法使用
nullptr
,因为我不需要 C++0x 编译器。
I want to declare a "safe" push()
function for use with auto_ptr
like this:
template<class StackType,typename T>
inline void push( StackType &s, auto_ptr<T> p ) {
s.push( p.get() );
p.release();
}
I also want it to work for null pointers, e.g.:
push( my_stack, 0 ); // push a null pointer
Hence, a specialization:
template<class StackType>
inline void push( StackType &s, int p ) {
s.push( reinterpret_cast<typename StackType::value_type>( p ) );
}
While it works, it's both ugly and allows erroneous code like:
push( my_stack, 1 ); // ???
to compile.
How can I write a specialization of push()
such that it accepts only 0
as a valid int
value (for the null pointer)?
Requirements
StackType
is some stack-like container class that I must use and whose source code I can not change (just likestd::stack
). I can assume it has apush()
member function.I can not use
nullptr
since I can not require a C++0x compiler.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
您可以按如下方式重载该函数:
然后使用它:
You could overload the function as follows:
then use it:
编辑:第二次迭代。 (第一个假设某个特定堆栈类的
push
方法将被重载。)此迭代旨在提供
push
作为任何提供推送的类的函数模板接受的成员可以存储T*
。目的是允许auto_ptr
和0
作为参数,但不允许使用其他整数值和指针。基本技巧仍然是相同的:提供一个重载,使得
push(s, 0)
实际上将0
解释为指向成员的空指针。测试:
EDIT: second iteration. (The first assumed that the
push
method of some particular stack class was to be overloaded.)This iteration instead seeks to provide
push
as a function template for any class providing a push member that takes can storeT*
. The intent is to allowauto_ptr<T>
and0
as arguments, but to disallow other integral values and pointers.The basic trick is still the same: provide an overload such that
push(s, 0)
actually interprets0
as a null pointer to member.Test:
您需要一个特定的空指针类型来处理这种情况。这就是 C++11 引入
nullptr
的原因。You need a specific null pointer type to handle this case. This is why C++11 brings in
nullptr
.