aboutsummaryrefslogtreecommitdiff
path: root/odb/details
diff options
context:
space:
mode:
authorKaren Arutyunov <karen@codesynthesis.com>2019-01-17 15:48:05 +0300
committerKaren Arutyunov <karen@codesynthesis.com>2019-01-18 13:59:31 +0300
commit7d79d5298f56c4768a90df629b689d1bc3ebbb31 (patch)
tree668ef735fa24ac7042f150bd823bcfcebebb5a92 /odb/details
parentd7fffb8fbd0743e6dfcf76eb4373bfead92bffc7 (diff)
Add function_wrapper::cast() that cleanly cast to an incompatible function type
Diffstat (limited to 'odb/details')
-rw-r--r--odb/details/function-wrapper.hxx5
-rw-r--r--odb/details/function-wrapper.ixx10
2 files changed, 15 insertions, 0 deletions
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<F>&);
+ // Cleanly cast to an incompatible function type.
+ //
+ template <typename R> 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<function_wrapper<F>&> (x));
return *this;
}
+
+ template <typename F>
+ template <typename R>
+ inline R function_wrapper<F>::
+ cast () const
+ {
+ union { F* f; R r; } r;
+ r.f = function;
+ return r.r;
+ }
}
}