------- Comment #13 from paolo dot carlini at oracle dot com 2009-12-21 20:29 ------- A tad simpler:
template<int> void* get(int); template<typename> struct unique_ptr; template<typename _Tp> struct unique_ptr<_Tp[]> { typedef int __tuple_type; void* get() const { return ::get<0>(_M_t); } __tuple_type _M_t; }; template <typename T> class dynamic_dispatch; template <typename TC> struct dynamic_dispatch<void (TC::*)(int&)> { struct entry { }; unique_ptr<entry[]> m_Start; template <typename UC> void attach_handler(void (UC::*m)(int&)) { entry* p = 0; do { } while(--p != m_Start.get()); } }; template <typename TC> class request_dispatcher : private dynamic_dispatch<void (TC::*)(int&)> { request_dispatcher(); }; struct file_reader { void execute_command(int&); }; template <> request_dispatcher<file_reader>::request_dispatcher() { this->attach_handler(&file_reader::execute_command); } -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=42447