Код: Выделить всё
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Однако для псевдонима ReturnType это проблема, потому что он оценивается на месте, и ему необходимо, чтобы StaticCallableInt имел Call(), объявленный к тому времени. Если эта потребность не будет удовлетворена, этот код не сможет скомпилироваться.
Существуют ли хорошие методы для псевдонимов типов в CRTP? Решение, которое мне приходит на ум, — использовать вспомогательный класс для всех деталей класса, которые нужны StaticCallable:
Код: Выделить всё
struct CallableInt
{
int Call() { return 2; }
};
struct StaticCallableInt : StaticCallable {};
Подробнее здесь: https://stackoverflow.com/questions/786 ... es-in-crtp