Являются ли концепции C ++ формой экзистенциального типа?

Я искал определение экзистенциальных типов в Википедии (Existential_types) и в некотором роде это похоже на концепции в C ++ (особенно Понятия Lite).

Являются ли концепции C ++ формой экзистенциального типа?

Если нет, то какие различия между ними?

10

Решение

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 это экзистенциальный тип.

4

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

Насколько я знаю, понятия 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, Концепции сделают это чище и проще в использовании.

Это опять-таки, просто примерно мое понимание.

3

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