Как написать концепцию c ++ для функции Heuristi c - PullRequest
2 голосов
/ 18 апреля 2020

Я реализую алгоритм поиска с функцией heuristi c в c ++ 20. Я пытаюсь ограничить функцию, которую мой алгоритм может использовать, с помощью такой концепции:

template<typename SelfType, unsigned from, unsigned to>
concept Heuristic = requires(SelfType h, unsigned current)
{
    { h(current) } -> unsigned;

    assert(h(to) == 0);
};

Тогда я могу написать что-то вроде:

template<unsigned from, unsigned to>
struct H
{
    unsigned operator()(unsigned current)
    {
        return to - current + 100;
    }
};

Конечно, assert не работает, и это не является допустимым heuristi c, потому что здесь h (to) равно 100. Я хочу, чтобы компилятор проверял во время компиляции, что h (до) равно 0.

1 Ответ

1 голос
/ 18 апреля 2020

Я хочу, чтобы компилятор проверял во время компиляции, что h (to) равен 0.

Это было бы возможно, только если компилятор смог вызвать h(to) при компиляции время. Что не может, потому что нет никакой гарантии, что любая вызванная функция будет constexpr. SelfType может быть типом указателя на функцию, а указатели на функции не содержат constexpr. И понятия не могут даже проверить, является ли что-то константным выражением или нет.

Когда вы начинаете задавать вопросы о том, отображаются ли значения в соответствующую область или функция отображает значения в область, это не так. больше не «концепция». Или, по крайней мере, это не концепт в смысле языковой характеристики.

То есть есть определенные вещи, когда мы считаем требованиями конкретного пользователя концепта, которые язык не может проверить. Библиотека концепций C ++ 20 полна этих аксиоматических c концептуальных требований.

Это также хорошая причина, почему вы должны использовать именованную функцию-член для своей эвристики, а не предполагать, что что-то, что имеет operator() Перегрузка, которая так происходит при преобразовании целых чисел без знака в целые числа без знака, - это "heuristi c".

...