Есть ли элегантный способ объявить набор функций с одинаковыми параметрами шаблона? - PullRequest
2 голосов
/ 01 августа 2020

Например, допустим, у меня есть простая шаблонная структура 2D-вектора:

template <typename T>
struct Vec { T x, y; };

И общий c способ суммирования:

template <typename T, typename U>
constexpr auto operator+(const Vec<T>& u, const Vec<U>& v) {
    return Vec<decltype(u.x + v.x)>{u.x + v.x, u.y + v.y};
}

Но я должен перепишите template <typename T, typename U> для всех остальных c операций (-, *, / et c.). I wi sh Я мог бы сделать что-то вроде:

template <typename T, typename U>
{
    constexpr auto operator+(const Vec<T>& u, const Vec<U>& v) { /* ... */ };
    constexpr auto operator-(const Vec<T>& u, const Vec<U>& v) { /* ... */ };
    /* ... */
}

Кроме того, как сказано в этом потоке , auto не допускается при вложении в спецификатор декларации, что означает что приведенное ниже решение недействительно (даже если оно каким-то образом компилируется):

constexpr auto operator+(const Vec<auto>& u, const Vec<auto>& v) { /* ... */ }

1 Ответ

0 голосов
/ 01 августа 2020

Вы можете сохранить один параметр шаблона, определив операторы в строке:

template <typename T>
struct Vec {
    T x, y; 
    template<class U> auto operator+(Vec<U> const& v)
    { return Vec<decltype(x + v.x)>{x + v.x, y + v.y};}
    template<class U> auto operator-(Vec<U> const& v)
    { return Vec<decltype(x - v.x)>{x - v.x, y - v.y};}
};

Если вы полностью хотите избежать написания повторяющегося кода, макросы будут способом избежать этого (будь то хорошая практика, и помогает ли это пониманию кода или мешает - это, вероятно, вопрос вкуса и контекста)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...