Видимость членов CRTPC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Видимость членов CRTP

Сообщение Anonymous »

Я пытаюсь лучше понять видимость членов класса C++ применительно к CRTP (любопытно повторяющийся шаблон шаблона). Должен отметить, что я понимаю использование CRTP и его «полиморфизм времени компиляции».
У меня есть следующий фрагмент кода.

Код: Выделить всё

// A C++ constraint for a type that is "closable".
template 
concept IsClosable = requires(T t)
{
{ t.closeImplementation() } -> std::same_as;
};

// I defer the constraint "IsClosable" to the function rather than the class
// otherwise when I use CRTP, the constraint would fail.
template 
class Base
{
public:
template 
void close()
{
static_cast(this)->closeImplementation();
}
};

class Derived : public Base
{
// Visibility in question here.
public:
void closeImplementation()
{

}
};
Я попытался проследить, что на самом деле видит здесь компилятор. Для простоты я уберу ограничение. При этом у меня есть следующее:
  • Перезапуск базового кода

Код: Выделить всё

template 
class Base
{
public:
void close()
{
static_cast(this)->closeImplementation();
}
};

class Derived : public Base
{
// Visibility in question here.
public:
void closeImplementation()
{

}
};
  • Компилятор сначала игнорирует объявление шаблона, поскольку еще ничего не создает его экземпляр.

    Компилятор встречает эту строку и начинает создавать экземпляр шаблона. Обратите внимание: хотя полный класс Derived не объявлен, этого должно быть достаточно для замены шаблона.

Код: Выделить всё

class Derived : public Base
что приводит к следующему

Код: Выделить всё

template 
class Base
{
public:
void close()
{
static_cast(this)->closeImplementation();
}
};
Я не совсем уверен, имеет ли эта строка смысл, пока у нас нет наследования. Похоже, что перед наследованием мы приводим этот базовый объект Base к Derived, который кажется несовместимым.
  • После создания экземпляра шаблона мы продолжаем объявление

Код: Выделить всё

class Derived : public Base
{
// Visibility in question here.
public:
void closeImplementation()
{

}
};
И если мы заменим методы, полученные из Base, это должно более или менее выглядеть так:

Код: Выделить всё

class Derived // Inheriting from Base
{
public:
void closeImplementation()
{

}

void close()
{
static_cast(this)->closeImplementation();
}
};
Поэтому у меня есть несколько вопросов.
  • Почему closeImplementation не может быть частный, если он «выглядит» как «закрытый», все равно может получить к нему доступ?
  • Имеет ли строка static_cast(this)-> closeImplementation() вызывается в классе Base или Derived? Если первое, то как это работает?
  • Правильно ли я понимаю, как компилятор рассматривает этот код?


Подробнее здесь: https://stackoverflow.com/questions/782 ... visibility
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»