alias для базового класса
Перенос предложения: голоса +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. (Последнее маловероятно.)
Александр Коганов, 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>
{/*...*/};
только хотел спросит а есть ли какой пропозл в комитете для этого... тоже надоело писать эти using алиясы
так что по итогу, двигается идея или заглохла ?