Как я могу разработать стандартную концепцию для своего класса? - PullRequest
1 голос
/ 06 мая 2020

У меня есть функция шаблона, которая должна работать для всех целочисленных типов:

#include <concepts>
template<typename T>
bool odd(T n) requires std::integral<T>
{
  return n & T(1);
}

Теперь я хочу использовать эту функцию с некоторым определяемым пользователем целочисленным типом, например boost :: multiprecision :: cpp_int

#include <boost/multiprecision/cpp_int.hpp>
boost::multiprecision::cpp_int n = ...
std::cout << odd(n) << std::endl;

g cc 10 дает

error: use of function ‘bool odd(T) requires  integral<T> [with T = boost::multiprecision ...

, что, конечно, правильно. Что я могу сделать, чтобы исправить это, например, как я могу специализировать стандартную концепцию для своего собственного типа?

Ответы [ 2 ]

1 голос
/ 06 мая 2020

Хорошо, поэтому я добавил строки

    template< class T >
    inline constexpr bool is_my_integral_v = false;

    template<>
    inline constexpr bool is_my_integral_v<boost::multiprecision::cpp_int> = true;

и изменил требование на

    template<typename T>
    bool odd(T n) requires std::integral<T> || is_my_integral_v<T>

, и теперь оно работает.

1 голос
/ 06 мая 2020

как я могу специализировать стандартную концепцию для моего собственного типа?

Вы этого не делаете. Понятия не могут быть специализированы. Типовые характеристики могут быть при определенных обстоятельствах, но std::integral - это не то, что вы можете, так что это тоже неправильный путь.

Что я могу сделать, чтобы исправить это

Вам нужно придумать правильную концепцию для набора используемых вами алгоритмов. Очевидно, самый буквальный из них:

template <typename T>
concept IsOddable = std::constructible_from<T, int> &&
    requires (T n) {
        { n & n } -> std::convertible_to<bool>;
    };

Но не делайте этого. Вам, вероятно, понадобится какая-то общая концепция c Numeric и добавить требования для любых +, *, % и т.д. c. Концепции исходят из алгоритмов - поэтому выясните общие c требования, которые предъявляются вашими алгоритмами, и работайте с ними.

...