From 7d79d5298f56c4768a90df629b689d1bc3ebbb31 Mon Sep 17 00:00:00 2001 From: Karen Arutyunov Date: Thu, 17 Jan 2019 15:48:05 +0300 Subject: Add function_wrapper::cast() that cleanly cast to an incompatible function type --- odb/database.cxx | 2 +- odb/details/function-wrapper.hxx | 5 +++++ odb/details/function-wrapper.ixx | 10 ++++++++++ odb/schema-catalog.cxx | 2 +- 4 files changed, 17 insertions(+), 2 deletions(-) diff --git a/odb/database.cxx b/odb/database.cxx index 7dd540f..f9e1043 100644 --- a/odb/database.cxx +++ b/odb/database.cxx @@ -67,7 +67,7 @@ namespace odb else { typedef void (*caller) (const void*, const char*, connection_type&); - reinterpret_cast (fw.function) (fw.std_function, name, c); + fw.cast () (fw.std_function, name, c); } return true; diff --git a/odb/details/function-wrapper.hxx b/odb/details/function-wrapper.hxx index 3a8ebfc..165df18 100644 --- a/odb/details/function-wrapper.hxx +++ b/odb/details/function-wrapper.hxx @@ -59,6 +59,11 @@ namespace odb void swap (function_wrapper&); + // Cleanly cast to an incompatible function type. + // + template R + cast () const; + // Conversion to bool. // public: diff --git a/odb/details/function-wrapper.ixx b/odb/details/function-wrapper.ixx index d73d578..9ec19ec 100644 --- a/odb/details/function-wrapper.ixx +++ b/odb/details/function-wrapper.ixx @@ -36,5 +36,15 @@ namespace odb swap (const_cast&> (x)); return *this; } + + template + template + inline R function_wrapper:: + cast () const + { + union { F* f; R r; } r; + r.f = function; + return r.r; + } } } diff --git a/odb/schema-catalog.cxx b/odb/schema-catalog.cxx index b767bca..946884f 100644 --- a/odb/schema-catalog.cxx +++ b/odb/schema-catalog.cxx @@ -227,7 +227,7 @@ namespace odb else { typedef void (*caller) (const void*, database&); - reinterpret_cast (m.function) (m.std_function, db); + m.cast () (m.std_function, db); } r++; } -- cgit v1.1