Я изучаю шаблоны махинаций в C ++ (C ++ 11), и мне хотелось бы иметь одну вещь — это чисто виртуальный тип в абстрактном классе. Это было бы как у Скалы абстрактные типы. В C ++ я хотел бы сделать что-то вроде следующего:
struct Base {
// Says any concrete subclass must define Type, but doesn't
// require that it be anything in particular.
virtual typedef MyType;
};
struct Derived : Base {
// Won't compile unless this typedef exists.
typedef int MyType;
};
есть идеи как это сделать?
Я не уверен, что это действительно необходимо в C ++.
Пытаясь поставить себя на место дизайнера, который ищет такое решение, я бы сказал, что такого рода ограничения потребуются для того, чтобы заставить некоторые типы придерживаться некоторого синтаксического соглашения.
Скорее всего, это необходимо, потому что универсальный алгоритм требует синтаксического соглашения: он не может работать с типами, которые не определяют такую ассоциацию типов.
Например, приведенный ниже алгоритм требует, чтобы тип его аргумента имел связанный bar_type
:
template<typename T>
bool foo(T t)
{
typedef typename T::bar_type FT;
FT ft;
...
}
Но если это так, то нет необходимости обеспечение соблюдения typedef
эффективно ограничивать ввод foo<>()
: просто опуская определение типа для bar_type
не позволит использовать этот тип с foo<>()
,
Конечно, вы обнаружите это только тогда, когда вы на самом деле пытаться сделать это, и не раньше. И быть в состоянии определить концепция такие как HasBarType
и затем применить некоторые типы для реализации этой концепции; с другой стороны, понятия не еще часть C ++ и, насколько они желательны, можно жить без них.
редактировать
Это не работает, но я думаю, любопытно повторяющийся шаблон может быть, путь.
/редактировать
template<typename Dependent>
class Base : public Dependent {
typedef typename Dependent::MyType MyType;
};
Затем используйте любопытно повторяющийся шаблон:
struct Derived : Base<Derived> {
// Won't compile unless this typedef exists.
typedef int MyType;
};