scala — C ++: чистый виртуальный тип

Я изучаю шаблоны махинаций в 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;
};

есть идеи как это сделать?

4

Решение

Я не уверен, что это действительно необходимо в 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 ++ и, насколько они желательны, можно жить без них.

5

Другие решения

редактировать

Это не работает, но я думаю, любопытно повторяющийся шаблон может быть, путь.

/редактировать

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;
};
0

По вопросам рекламы [email protected]