cpp-ru / ideas

Идеи по улучшению языка C++ для обсуждения
https://cpp-ru.github.io/proposals
Creative Commons Zero v1.0 Universal
90 stars 0 forks source link

alias для базового класса #421

Open apolukhin opened 3 years ago

apolukhin commented 3 years ago

Перенос предложения: голоса +13, -1 Автор идеи: Даниил Милютин

При наследовании (особенно с шаблонами) возникает следующая ситуация

template<typename T1, typename T2, typename T3>
class Derived: public Base<T1, T2>, protected Policy<T3>
{
protected:
  using help = Policy<T3>;
public:
  using super = Base<T1, T2>;
  void foo()
  {
    super::foo(help::someMethod());//
  }
};

Приходится два раза вбивать ( = копипастить) имя класса, чтобы получить alias.

Предлагается сократить boilerplate следующим образом:

template<typename T1, typename T2, typename T3>
class Derived: public Base<T1, T2> => super, protected Policy<T3> => help
{
public:
  void foo()
  {
    super::foo(help::someMethod());//
  }
};

Предполагается, что alias находятся в той же области видимости и имеют те же модификаторы доступа.

Если очень хочется управлять областью видимости и модификаторами доступа alias, то можно предложить следующий синтаксис:

template<typename T1, typename T2, typename T3>
class Derived
    : public Base<T1, T2> => private super
    , public Policy<T3> => private help
{/*...*/};

Хотя в этом случае мне видится разумным использовать старый синтаксис.

Символ "=>" мне пока что видится самым уместным. Его можно бы заменить на "=" или на "->" или на "typedef" или даже на ключевое слово as. (Последнее маловероятно.)

apolukhin commented 3 years ago

Александр Коганов, 18 марта 2019, 12:01 Очень часто приходится копипастить название базового класса, который к тому же шаблон с несколькими параметрами, которые тоже шаблоны, чьи параметры зависят от параметров производного класса. И если где-то нужно что-то поменять, приходится делать это дважды. И каждый раз удивляюсь, почему нельзя было сделать в языке такой алиас

Antervis, 18 марта 2019, 13:48 Неплохая идея. Вот только ключевого слова as в языке нет, а оператор => для типов не очень уместен, лучше подойдут typedef или ->. Я бы предпочел typedef.

Sasha Sitnikov, 25 марта 2019, 15:05 Также можно использовать using, причем модификуатор доступа по умолчанию такой же (для struct - public, для class - private)

template<typename T1, typename T2, typename T3>
class Derived
    : public using super = public Base<T1, T2>
    , using help = public Policy<T3>
{/*...*/};
marakew commented 2 years ago

только хотел спросит а есть ли какой пропозл в комитете для этого... тоже надоело писать эти using алиясы

так что по итогу, двигается идея или заглохла ?