-1
我有以下代碼我沒有在testFunc中檢查null,因爲我們在controlPtr類中檢查,而不是我想返回。我正在尋找一些可以在模板類中添加的宏,以便我可以在函數中使用。 (注意:我正在尋找沒有例外的選項)。在模板類C++中使用宏檢查空值
void AssertErrorHandler(const char* file_name, unsigned line_number, const char* message) {
std::cout << message << " in file " << file_name << " #" << line_number << std::endl << std::flush;
}
#define CONTROLASSERT(condition, msg) \
if(!(condition)) { \
std::ostringstream s; \
s << msg; \
AssertErrorHandler( \
__FILE__, __LINE__, s.str().c_str()); \
}
template <typename T>
class ControlPtr {
public:
explicit ControlPtr(T* p = NULL)
: ptr_(p) {
}
T* Get() const {
return ptr_;
}
ControlPtr<T>& operator=(T* p) {
ptr_ = p;
return *this;
}
T* operator->() const {
CONTROLASSERT(ptr_ != NULL, "Attempt to use operator -> on NULL pointer.");
return ptr_;
}
T& operator*() const {
CONTROLASSERT(ptr_ != NULL, "Attempt to use operator * on NULL pointer.");
return *ptr_;
}
private:
T* ptr_;
};
void testFunc() {
int i = 10;
ControlPtr<int> ptr(NULL); // Question: From here I should return. How can I modify controlPtr class above
// Do I use #define macro
std::cout << *ptr << std::endl;
return;
}
int main(void)
{
testFunc();
return 0;
}
您從不使用'#define'宏... – 2013-03-18 13:12:56
拋出異常?這就是他們的目的......在你的構造函數檢查指針是否爲空,如果是這樣的話...... – Nim 2013-03-18 13:18:56
我正在尋找與例外,任何其他替代目前 – venkysmarty 2013-03-18 13:27:17