00001
00002
00003 #ifndef DUNE_COMMON_PROXYMEMBERACCESS_HH
00004 #define DUNE_COMMON_PROXYMEMBERACCESS_HH
00005
00011 #include <type_traits>
00012 #include <utility>
00013
00014 namespace Dune {
00015
00016 namespace {
00017
00018
00019
00020 template<typename T>
00021 struct member_access_proxy_holder
00022 {
00023
00024
00025 member_access_proxy_holder(T&& t)
00026 : _t(std::move(t))
00027 {}
00028
00029
00030
00031 const T* operator->() const
00032 {
00033 return &_t;
00034 }
00035
00036 T _t;
00037
00038 };
00039
00040 }
00041
00042
00043 #ifdef DOXYGEN
00044
00046
00074 template<typename T>
00075 pointer_or_proxy_holder
00076 handle_proxy_member_access(T&& t);
00077
00078 #else // DOXYGEN
00079
00080
00081
00082
00083
00084
00085 template<typename T>
00086 inline typename std::enable_if<
00087 std::is_lvalue_reference<T>::value,
00088 typename std::add_pointer<
00089 typename std::remove_reference<
00090 T
00091 >::type
00092 >::type
00093 >::type
00094 handle_proxy_member_access(T&& target)
00095 {
00096 return ⌖
00097 }
00098
00099
00100
00101
00102
00103
00104 template<typename T>
00105 inline typename std::enable_if<
00106 !std::is_lvalue_reference<T>::value,
00107 member_access_proxy_holder<T>
00108 >::type
00109 handle_proxy_member_access(T&& target)
00110 {
00111 return {std::forward<T>(target)};
00112 }
00113
00114 #endif // DOXYGEN
00115
00116 }
00117
00118 #endif // DUNE_COMMON_PROXYMEMBERACCESS_HH