模板 get_visitor的理解,以及模板函式物件當函式使用
阿新 • • 發佈:2018-12-13
最近程式出現了crash 問題,追蹤程式碼的時候,發現了這個模板類,是因為其返回了 空指標導致的,然後就做了一些實驗
template <typename T>
struct get_visitor{
typedef T* result_type;
result_type operator()(T& val) const {return & val;
}
template <typename U>
result_type operator()(const U& ) const {return nullptr;
}
};
我們知道 類裡邊 operator () 是函式物件
函式物件也可以當函式使用
比如
struct Printer{
void operator()(const std::string & str)const{
std::cout<<str<<std::endl;
}
};
int main() {
Printer print;
print("hello world");
// or
Printer()("hello world");
return 0;
}
那麼同樣的,對於開頭說展示的這個模板
int main() { int a = 10; string b = "abc"; cout<<&a<<endl; auto g_a= get_visitor<int>()(a) ; auto g_b= get_visitor<int>()(b) ; cout<< typeid(g_a).name()<<endl; cout<< g_a<<endl; cout<< g_b<<endl; return 0; } // console ouput /* 0x7ffd5856a838 Pi //pointer to type int 0x7ffd5856a838 0 // nullptr */
那麼這個 get_visitor 模板的作用就是,獲取傳入資料的地址,如果型別不匹配就返回 空指標