Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <typeinfo>
- #include <type_traits>
- template <typename Fn, typename T>
- void dy_call(Fn call_back, T& t) {
- const std::type_info& info = typeid(call_back);
- if ( info == typeid(void (*)(T&)))
- ((void (*)(T&))call_back)(t);
- else if ( info == typeid(void (*)(const T&)) )
- ((void (*)(const T&))call_back)(t);
- else if ( info == typeid(void (*)(T)) )
- ((void (*)(T))call_back)(t);
- else
- std::cout << "dy_call(Fn call_back, T& t): Failed to match" << std::endl;
- }
- template <typename Fn, typename T>
- void dy_call(Fn call_back, const T& t) {
- const std::type_info& info = typeid(call_back);
- if ( info == typeid(void (*)(const T&)) )
- ((void (*)(const T&))call_back)(t);
- else if ( info == typeid(void (*)(T)) )
- ((void (*)(T))call_back)(t);
- else
- std::cout << "dy_call(Fn call_back, T& t): Failed to match" << std::endl;
- }
- template <typename Fn, typename T>
- void dy_call_Cpp11(Fn call_back, T&& t) {
- const std::type_info& info = typeid(call_back);
- if ( !std::is_const<T>::value && std::is_reference<T>::value && info == typeid(void (*)(T))) // 尝试普通引用
- return ((void (*)(T&))call_back)(t);
- if ( info == typeid(void (*)(const typename std::remove_reference<T>::type&)) ) // 尝试const引用
- return ((void (*)(const typename std::remove_reference<T>::type&))call_back)(t);
- if ( info == typeid(void (*)(typename std::remove_reference<T>::type)) ) // 尝试传值
- return ((void (*)(typename std::remove_reference<T>::type))call_back)(t);
- std::cout << "dy_call(Fn call_back, T& t): Failed to match" << std::endl; // 调用失败
- }
- /////////////////////////////////////////////////////////////////////////////////////
- using namespace std;
- void fn_int(int arg) { cout << "fn_int is called" << endl; }
- void fn_int_r(int& arg) { cout << "fn_int_r is called" << endl; }
- void fn_int_cr(const int& arg) { cout << "fn_int_cr is called" << endl; }
- inline void fn(int&& a) { cout << a; }
- int main() {
- fn(12);
- int a = 10;
- int& r = a;
- const int& cr = a;
- dy_call(fn_int, 10);
- dy_call(fn_int, a);
- dy_call(fn_int, r);
- dy_call(fn_int, cr);
- dy_call(fn_int_r, 10);
- dy_call(fn_int_r, a);
- dy_call(fn_int_r, r);
- dy_call(fn_int_r, cr);
- dy_call(fn_int_cr, 10);
- dy_call(fn_int_cr, a);
- dy_call(fn_int_cr, r);
- dy_call(fn_int_cr, cr);
- cout << endl << endl;
- dy_call_Cpp11(fn_int, 10);
- dy_call_Cpp11(fn_int, a);
- dy_call_Cpp11(fn_int, r);
- dy_call_Cpp11(fn_int, cr);
- dy_call_Cpp11(fn_int_r, 10);
- dy_call_Cpp11(fn_int_r, a);
- dy_call_Cpp11(fn_int_r, r);
- dy_call_Cpp11(fn_int_r, cr);
- dy_call_Cpp11(fn_int_cr, 10);
- dy_call_Cpp11(fn_int_cr, a);
- dy_call_Cpp11(fn_int_cr, r);
- dy_call_Cpp11(fn_int_cr, cr);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement