Есть ли простой способ проверить ваш код на соответствие названным требованиям стандарта? - PullRequest
1 голос
/ 23 февраля 2020

Допустим, я хотел написать итератор для своего пользовательского контейнера, который использует пользовательский распределитель, но все еще придерживается стандарта C ++, так что я могу быть уверен, что он будет работать со стандартными алгоритмами. Есть ли простой способ проверить, соответствует ли все вышеперечисленное требованиям, скажем, LegacyRandomAccessIterator , Контейнер и Распределитель ?

Я осознавая, что эти требования перечислены здесь , но давайте просто скажем, что формулировка иногда оставляет место для двусмысленности ( LegacyContiguousIterator буквально LegacyRandomAccessIterator в надежде, что виртуальная насколько мне известно, память будет отображаться 1-к-1 в ее базовом физическом хранилище.

Ответы [ 3 ]

1 голос
/ 23 февраля 2020

С C ++ 20 вы можете static_assert(...), что концепции встречаются:

class some_iterator { ... };
static_assert(requires std::random_access_iterator<some_iterator>);
1 голос
/ 23 февраля 2020

Если бы в C ++ был простой способ проверить, соответствует ли тип концепции ... C ++ 20 не потребовалось бы создать этот механизм. В конце концов, это то, что представляют собой концепции C ++ 20.

Конечно, функция C ++ 20 вводит концепции стандартных библиотек, которые похожи, но не эквивалентны версиям "Legacy". То есть Cpp17RandomAccessIterator - это не то же самое, что std::random_access_iterator. Они довольно близки, но тестируемая концепция C ++ 20 допускает то, чего не может назвать названное требование C ++ 17.

1 голос
/ 23 февраля 2020

Нет единого метода проверки для STL реализаций. Каждая реализация предоставляет собственные тесты. Вы можете посмотреть примеры Microsoft STL . Адаптация тестов для ваших собственных реализаций не должна быть сложной, поскольку интерфейс такой же.

...