diff options
author | Sumit Bhardwaj <bhardwajs@outlook.com> | 2020-07-03 06:36:10 (GMT) |
---|---|---|
committer | Brad King <brad.king@kitware.com> | 2020-07-06 13:30:56 (GMT) |
commit | 8843946519294d060a4a287ff89b78531075511f (patch) | |
tree | 5cc17aeca55db8ad3805a6854c340dfbf93a12ec | |
parent | 1e26c84b96c0ec6887de2cf5e14061ccb83bdbfe (diff) | |
download | CMake-8843946519294d060a4a287ff89b78531075511f.zip CMake-8843946519294d060a4a287ff89b78531075511f.tar.gz CMake-8843946519294d060a4a287ff89b78531075511f.tar.bz2 |
cmext: Implement cm::static_reference_cast by declval
Previously, `cm::static_reference_cast` used `invoke_result_t` and took
the address of `O::get`. This is not in complete conformance with
standard.
Change the implementation to use `std::declval<O>.get()` which is always
well-defined.
-rw-r--r-- | Utilities/std/cmext/memory | 17 |
1 files changed, 9 insertions, 8 deletions
diff --git a/Utilities/std/cmext/memory b/Utilities/std/cmext/memory index 50e79df..fa326f0 100644 --- a/Utilities/std/cmext/memory +++ b/Utilities/std/cmext/memory @@ -12,18 +12,19 @@ namespace cm { -template <typename T, typename O, - cm::enable_if_t< - std::is_pointer<cm::invoke_result_t<decltype(&O::get), O>>::value, - int> = 0> +template < + typename T, typename O, + cm::enable_if_t<std::is_pointer<decltype(std::declval<O>().get())>::value, + int> = 0> T& static_reference_cast(O& item) { return *(static_cast<T*>(item.get())); } -template <typename T, typename O, - cm::enable_if_t< - std::is_pointer<cm::invoke_result_t<decltype(&O::get), O>>::value, - int> = 0> + +template < + typename T, typename O, + cm::enable_if_t<std::is_pointer<decltype(std::declval<O>().get())>::value, + int> = 0> T& dynamic_reference_cast(O& item) { auto p = dynamic_cast<T*>(item.get()); |