Если вы хотите разоблачить каждую ссылку на переменную, выведите ее.
p.value_
делает именно то, что вы хотите.
Запрещая, что самый простой способ, чтобы написать:
template< class A, class B >
using same_test = std::enable_if_t< std::is_same< std::decay_t<A>, std::decay_t<B> >{}, int>
затем внутри класса пишут:
template<class Self, same_test<Self, Parameter> =0>
friend decltype(auto) get_value(Self&& self) {
return decltype(self)(self).value_;
}
Теперь get_value(p)
вернется p.value
с правом квалификации л/г/Cv.
Если вам не нравится этот синтаксис, я могу предоставить вам (p->*value)()
:
template<class F>
struct magic_method_ptr_t {
F f;
template<class Lhs>
friend auto operator->*(Lhs&& lhs, magic_method const& m) {
return [&](auto&&...args)->decltype(auto) {
return m.f(decltype(lhs)(lhs), decltype(args)(args)...);
};
}
};
template<class F>
magic_method_ptr_t<F> magic_method_ptr(F f) { return {std::move(f)}; }
auto value = magic_method_ptr([](auto&& x){ return get_value(decltype(x)(x)); }
Добавьте к этому get_value
случае выше, и (p->*value)()
работы.
Я не могу предоставить вам p.value()
синтаксис, запрещающий уродливые макросы.
ли вы часто использовать 'константные объекты volatile'? Я никогда их не видел. –
Возможно, вы захотите написать простой генератор кода. – Arun
Я сделал что-то подобное с помощью макросов. –