1. 程式人生 > >模板 get_visitor的理解,以及模板函式物件當函式使用

模板 get_visitor的理解,以及模板函式物件當函式使用

最近程式出現了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 模板的作用就是,獲取傳入資料的地址,如果型別不匹配就返回 空指標