我想聲明中使用的「安全」 push()
功能與auto_ptr
這樣的:提供了一個「安全的」推()函數的使用與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編譯器。
你會知道在編譯時,該指針爲空?即你會有這樣的代碼嗎?:'char * ptr = 0; push(my_stack,ptr);' – 2011-05-18 00:17:51
@Aaron:我會在編譯時知道指針是空的,即,是字面值0. – 2011-05-18 00:28:52
我還沒有一個好的答案,但是澄清它是一個字面'0'是有用的。你會被允許製作你自己的'nullptr'類型的克隆,並且要求用戶傳入一個這種類型的實例嗎? 'push(my_stack,my_null)'還有一個問題:假設它必須是一個文字'0',你會被允許將'push'定義爲一個宏嗎? – 2011-05-18 13:14:15