Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / C++ Новый топик    Ответить
 Автоматический alias для базового типа  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52921
Когда мы пишем, например
struct MyClass: public std::basic_string<unsigned char> {}

то теряем возможность обращаться к методам базового класса. То есть следующее даже не
скомпилируется:
MyClass foo; foo.append("abc", 3);

И даже это не скомпилируется:
MyClass foo; foo.append(reinterpret_cast<const unsigned char*>("abc"), 3);

Чтобы оно таки скомпилировалось, нам придётся добавить в объявление MyClass
public: using std::basic_string<unsigned_char>::append;


Собственно вопрос: можно ли в этом месте как-то обойтись без полного припева
"std::basic_string<unsigned_char>"?

Сообщение было отредактировано: 10 фев 21, 19:23
10 фев 21, 19:27    [22279085]     Ответить | Цитировать Сообщить модератору
 Re: Автоматический alias для базового типа  [new]
petrav
Member

Откуда:
Сообщений: 2861
Dimitry Sibiryakov

Собственно вопрос: можно ли в этом месте как-то обойтись без полного припева
"std::basic_string<unsigned_char>"?

Я делаю так в подобных случаях:

using Base = std::basic_string<unsigned_char>;

public: using Base::append;

Вы уверены, что ваши примеры не компилируются? Потому что у меня компилируются.
После приведения типа строки, конечно.
10 фев 21, 19:43    [22279097]     Ответить | Цитировать Сообщить модератору
 Re: Автоматический alias для базового типа  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52921

petrav
Вы уверены, что ваши примеры не компилируются?

Уверен.

petrav
Потому что у меня компилируются.

Возможно, тут роляет что у меня в классе ещё одна перегрузка append добавлена и это
выбивает унаследованные за пределы видимости.

Posted via ActualForum NNTP Server 1.5

10 фев 21, 19:51    [22279103]     Ответить | Цитировать Сообщить модератору
 Re: Автоматический alias для базового типа  [new]
petrav
Member

Откуда:
Сообщений: 2861
Почему вы решили, что после наследования нельзя вызывать методы базового класса?

В вашем коде другая проблема. Метод append(), по идее, должен вернуть MyClass&, а
вернёт std::basic_string&.
10 фев 21, 19:52    [22279104]     Ответить | Цитировать Сообщить модератору
 Re: Автоматический alias для базового типа  [new]
petrav
Member

Откуда:
Сообщений: 2861
Dimitry Sibiryakov

Возможно, тут роляет что у меня в классе ещё одна перегрузка append добавлена и это
выбивает унаследованные за пределы видимости.

А ну это само собой. Метод append() в наследнике экранирует все перегрузки append() в базовом классе.
Так всегда было. Могу предложить:

using Base::append;
10 фев 21, 19:54    [22279108]     Ответить | Цитировать Сообщить модератору
 Re: Автоматический alias для базового типа  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52921

Да, походу придётся удовлетвориться
typedef std::basic_string<unsigned char> ustring;
class foo: public ustring
{
   using ustring::append;
};

и надеяться, что комитет по извращениям когда-нибудь введёт
class foo: public std::basic_string<unsigned char> alias ustring

Posted via ActualForum NNTP Server 1.5

10 фев 21, 20:03    [22279117]     Ответить | Цитировать Сообщить модератору
 Re: Автоматический alias для базового типа  [new]
petrav
Member

Откуда:
Сообщений: 2861
И тем не менее append() у вас возвращает не то что нужно. По сути вы поломали логику класса.
10 фев 21, 20:29    [22279138]     Ответить | Цитировать Сообщить модератору
 Re: Автоматический alias для базового типа  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52921

Наплевать, это мой класс и как я его использую - моё дело.

Posted via ActualForum NNTP Server 1.5

10 фев 21, 23:07    [22279198]     Ответить | Цитировать Сообщить модератору
 Re: Автоматический alias для базового типа  [new]
a guest
Member

Откуда:
Сообщений: 326
Dimitry Sibiryakov

Да, походу придётся удовлетвориться
typedef std::basic_string<unsigned char> ustring;
class foo: public ustring
{
   using ustring::append;
};

и надеяться, что комитет по извращениям когда-нибудь введёт
class foo: public std::basic_string<unsigned char> alias ustring

Похоже, что комитет не убедила необходимость в таком алиасинге.
+
Хотя вот за n2881 все голосовали "за" и никто "против".
10 фев 21, 23:49    [22279209]     Ответить | Цитировать Сообщить модератору
 Re: Автоматический alias для базового типа  [new]
petrav
Member

Откуда:
Сообщений: 2861
a guest
Хотя вот за n2881 все голосовали "за" и никто "против".

Классно. А почему оно не компилируется?

class Foo {};

class Bar: Base = public Foo {};
11 фев 21, 00:18    [22279219]     Ответить | Цитировать Сообщить модератору
 Re: Автоматический alias для базового типа  [new]
a guest
Member

Откуда:
Сообщений: 326
petrav, дальше голосования на EWG, видимо, не пошло.
11 фев 21, 00:50    [22279224]     Ответить | Цитировать Сообщить модератору
Все форумы / C++ Ответить