Можно ли (и как) добавить проверку контракта типа для параметра функции шаблона C ++? - PullRequest
0 голосов
/ 10 мая 2018

Например, я хочу реализовать свою собственную универсальную функцию сортировки, я хочу, чтобы тип, который был бы передан, был Indexable, а элемент внутри был бы Comparable

template <typename Cont>
    **type_check: Cont is Indexable, Cont::Element is Comparable**
void my_sort(Cont& cont){
    // do sorting work
}

Когда я сделаю my_sort(vector<int>{1,6,5,4}) все будет в порядке

Но когда my_sort(linkedlist<int>{1,6,5,4}) мне не удастся во время компиляции / выполнения, потому что linkedlist не Indexable.

Так есть ли способ сделать такое программирование типа контракта?

P.S. Я нахожусь в среде C ++ 11, но любое решение в более поздней версии C ++ также приветствуется

Ответы [ 2 ]

0 голосов
/ 10 мая 2018

Как упоминалось в комментариях, как только Concepts TS войдет в стандарт C ++, вы сможете сделать это с помощью чего-то вроде:

template <typename T>
concept Sortable = requires(T t) {
    { t[0] < t[0] } -> bool
};

template <Sortable Cont>
my_sort(Cont& cont) {
    // do sorting work
}

Live Demo

Более старая версия Concepts TS реализована в GCC с флагом -fconcepts, но не будет в стандарте до C ++ 20. До тех пор вы можете обойтись трюками SFINAE:

template <typename Cont>
std::enable_if_t<std::is_convertible_v<decltype(std::declval<Cont>()[0] < std::declval<Cont>()[0]), bool>>
my_sort(Cont& cont) {
    // ...
}

Это не удастся скомпилировать, если для данного Cont c, c[0] < c[0] либо недействительно, либо не конвертируется в bool.
Live Demo

0 голосов
/ 10 мая 2018

С SFINAE вы можете сделать что-то вроде:

template <typename Cont>
auto my_sort(Cont& cont)
-> decltype(cont[42], // Indexable
            void(), // That void to avoid evil overload of operator comma
            std::declval<Cont::Element>() < std::declval<Cont::Element>(), // Comparable
            void()) // That final void for the return type of sort
{
    // do sorting work
}

std::enable_if является альтернативой (decltype), если у вас есть готовые черты.

...