У меня есть следующий фрагмент кода.
Код: Выделить всё
// 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();
}
};
- После создания экземпляра шаблона мы продолжаем объявление
Код: Выделить всё
class Derived : public Base
{
// Visibility in question here.
public:
void closeImplementation()
{
}
};
Код: Выделить всё
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