У меня есть строго шаблонный класс, из которого я хочу использовать геттер. Следуя общепринятому соглашению, я избежал дублирования кода следующим образом:
template< typename Foo, typename... Bars >
class Templated
{
...
constexpr const Foo& get() const
{
return mFoo;
}
constexpr Foo& get()
{
return const_cast<Foo&>(const_cast<const Templated<Foo, Bars...> *>(this)->get());
}
Однако мне пришло в голову, что второе определение становится немного неуклюжим, особенно с классом, который имеет много параметров шаблона. К счастью, после небольшого возмущения я понял, что могу упростить это для любого универсального шаблона класса до:
constexpr Foo& get()
{
return const_cast<Foo&>(const_cast<decltype(this)>(this)->get());
Это работает, потому что по какой-то причине decltype (this) преобразуется в константный указатель на тип объекта класса, тогда как just (this) преобразуется в неконстантный указатель на тип объекта класса. Почему в мире это так?