Учитывая базовый класс, использующий CRTP, я рассматриваю объявление члена в базовом классе шаблона, где тип зависит от производного класса.
В то время как следующее работает по назначению:
template <class T> class BaseTraits;
template <class T> class Base {
using TypeId = typename BaseTraits<T>::TypeId;
TypeId id;
public:
Base() { id = 123; }
TypeId getId() { return id; }
};
class Derived;
template <> class BaseTraits<Derived> {
public:
using TypeId = int;
};
class Derived : public Base<Derived> {};
int main(int argc, char ** argv) {
Derived foo;
return foo.getId();
}
Интересно, смогу ли я упростить реализацию. Я мог бы добавить второй параметр шаблона в шаблон Base
и сделать BaseTraits
проще или даже избавиться от него. Однако приведенный выше фрагмент уже является попыткой удалить второй параметр шаблона. Я ищу решения, которые не включают второй параметр шаблона для Base
.
Я пробовал что-то вроде следующего, но он не компилируется:
ошибка: неправильное использование неполного типа «Производный класс»
template <class T> class Base {
using TypeId = typename T::TypeId;
TypeId id;
public:
Base() { id = 123; }
TypeId getId() { return id; }
};
class Derived : public Base<Derived> {
public:
using TypeId = int;
};
int main(int argc, char ** argv) {
Derived foo;
return foo.getId();
}
ОБНОВЛЕНИЕ:
- Я ограничен С++ 14.
Base
должен быть шаблоном.- Производительность обязательна.
id
был членомBase
? С тем же успехом вы могли бы сделать его членомDerived
... - person n. 1.8e9-where's-my-share m.   schedule 11.12.2017