Я искал определение экзистенциальных типов в Википедии (Existential_types) и в некотором роде это похоже на концепции в C ++ (особенно Понятия Lite).
Являются ли концепции C ++ формой экзистенциального типа?
Если нет, то какие различия между ними?
TL; DRДа, концепции — это (или, по крайней мере, позволяют вам определять) экзистенциальные типы.
Вот мои рассуждения, хотя будьте осторожны; Я не теоретик типов
Рассматривать Википедия определение абстрактного типа данных (выделение мое):
В информатике абстрактный тип данных (ADT) математическая модель для определенного класса типов данных одного или нескольких языков программирования, имеющих сходную семантику. Абстрактный тип данных определяется косвенно, только операциями, которые могут быть выполнены над ним, и математическими ограничениями на влияние (и, возможно, стоимость) этих операций.
Экзистенциальные типы, как описано эти два Похоже, что вопросы переполнения стека и статья в Википедии являются способом моделирования абстрактных типов данных с использованием параметризованных определений. Важно отметить, что эти параметры не часть результирующего экзистенциального типа.
На первый взгляд, концепция, с другой стороны, является предикатом для одного (ноль?) Или нескольких типов, которые могут использоваться для ограничения шаблонов. Не очевидно, что они имеют какое-либо отношение к экзистенциальным типам — пока вы не рассмотрите requires
статьи.
В принципе, requires
позволяет проверять определенные свойства типов. Среди них — определяют ли они определенный тип члена, имеют ли они определенную функцию-член, могут ли они быть преобразованы в определенные типы и т. Д. Это наблюдение (на самом деле, основная точка разработки) — это то, что лежит в основе вопроса.
По крайней мере, мне кажется, что в основе своей лежит концепция определения абстрактных типов данных. Здесь мы начинаем видеть сходство с экзистенциальными типами: они моделируют ADT путем параметризации и, что более важно, позволяют вам определять ADT без выставления параметров.
Возьмите Container
концепция, например. Вы можете, с помощью Concepts Lite, написать что-то вроде
void print (Container c) {
for (const auto& e : c)
print (e);
}
// Later
print (std::vector <int> {1, 2, 3, 4});
Это работает, потому что там существует какой-то тип I
такие, что выражения begin (c)
а также end (c)
возвращать объекты типа I
, вместе с Container
другие ограничения. Это экзистенциальное количественное определение; Container
это экзистенциальный тип.
Насколько я знаю, понятия C ++ являются предикатами произвольного типа. Работа над концепциями C ++ больше концентрируется на том, как эти предикаты интегрируются в язык, а не на придании определенного значения или определении математической / логической модели. Идея в том, что именно как функция
void f(double x);
явно ожидает параметр типа double
таким простым способом
template <Container C>
void f(const C& c);
ожидает не просто typename
но Container
, Теперь, как это Container
определены? Это может быть, например,
template <typename T>
struct Container: std::false_type { };
template <typename T, size_t N>
struct Container <std::array<T, N> >: std::true_type { };
template <typename T, typename A>
struct Container <std::vector<T, A> >: std::true_type { };
и так далее. Предикаты как Container
существуют, но для интеграции их в функцию шаблона требуются неудобные конструкции, такие как std::enable_if
, Концепции сделают это чище и проще в использовании.
Это опять-таки, просто примерно мое понимание.