Есть ли способ, чтобы псевдонимы типов зависели от неполных типов в CRTP?C++

Программы на C++. Форум разработчиков
Anonymous
Есть ли способ, чтобы псевдонимы типов зависели от неполных типов в CRTP?

Сообщение Anonymous »

Возьмем простой пример CRTP:

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

template 
struct StaticCallable
{
static auto StaticCall()
{
return Target().Call();
}

using ReturnType = decltype(Target().Call());
};

struct StaticCallableInt : StaticCallable
{
int Call() { return 2; }
};

int main()
{
StaticCallableInt::ReturnType val;
val = StaticCallableInt::StaticCall();
}

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

StaticCallable
создается с помощью StaticCallableInt, который на тот момент не является полным типом. Для StaticCall() это нормально. Оценка откладывается до тех пор, пока не будет вызвана функция, и к тому времени StaticCallableInt станет полным типом.
Однако для псевдонима ReturnType это проблема, потому что он оценивается на месте, и ему необходимо, чтобы StaticCallableInt имел Call(), объявленный к тому времени. Если эта потребность не будет удовлетворена, этот код не сможет скомпилироваться.
Существуют ли хорошие методы для псевдонимов типов в CRTP? Решение, которое мне приходит на ум, — использовать вспомогательный класс для всех деталей класса, которые нужны StaticCallable:

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

struct CallableInt
{
int Call() { return 2; }
};

struct StaticCallableInt : StaticCallable {};
Есть ли другие способы заставить псевдонимы типов зависеть от неполных типов, например, путем отсрочки вычисления псевдонима?

Подробнее здесь: https://stackoverflow.com/questions/786 ... es-in-crtp

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