С выходом нового стандарта ситуация как-нибудь поменялась? А то пока наиболее простой и универсальный способ, который видел,
class CA
{
<...>
//--------------------------------------
const T* foo(const T* p)const { return foo_impl(p); }
//--------------------------------------
T* foo(T* p) { return foo_impl(p); }
//--------------------------------------
template<typename T_Qualified>
static
T_Qualified* foo_impl(T_Qualified* p)
{
<...>
}
//--------------------------------------
};
Но с ним возникают сложности, если зависимость типов, которые должны "менять квалификацию" в зависимости от квалификации метода, растет (например, если foo должна возвращать указатель на некий T1, а не на T).
Если возвращается что-то, что меняет свою константность вместе с константностью метода, то можно так:
class CA
{
private:
CM m_m;
template<typename This>
static decltype(auto) foo_impl(This *pThis)
{
return pThis->m_m;
}
public:
decltype(auto) foo() const { return foo_impl(this); }
decltype(auto) foo() { return foo_impl(this); }
};
Здравствуйте, _hum_, Вы писали: