функция Friend класса шаблона, который имеет различные параметры шаблона в качестве входных данных - PullRequest
0 голосов
/ 28 сентября 2018

У меня есть класс для формата с плавающей запятой, где размер мантиссы и экспоненты можно указать в качестве параметра шаблона:

template <int _m_size, int _exp_size>
class fpxx {

public:
    const int exp_size      = _exp_size;
    const int m_size        = _m_size;

    bool        sign;
    unsigned    exp;
    unsigned    m;
    ...
}

У меня также есть оператор друга + для добавления 2 таких чисел:

friend fpxx<_m_size, _exp_size>  operator+(const fpxx<_m_size, _exp_size> left, const fpxx<_m_size, _exp_size> right) 
{
    ...
}

Это прекрасно работает.

Это позволяет мне делать такие вещи:

fpxx<18,5> a, b, r;
r = a + b;

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

fpxx<10,4> a;
fpxx<12,4> a;
fpxx<18,5> r;
r = a + b;

Но я понятия не имею, как сделать объявление функции для этого.

Возможно ли это?

Спасибо!Том

1 Ответ

0 голосов
/ 28 сентября 2018

Создайте шаблон вашего оператора и сделайте его friend, что-то вроде:

template <int _m_size, int _exp_size>
class fpxx {

public:
    const int exp_size      = _exp_size;
    const int m_size        = _m_size;

    bool        sign;
    unsigned    exp;
    unsigned    m;

template <int s1, int e1, int s2, int e2>
friend fpxx</*..*/> operator+(const fpxx<s1, e1>& left, const fpxx<s2, e2>& right);

};

template <int s1, int e1, int s2, int e2>
fpxx</*..*/> operator+(const fpxx<s1, e1>& left, const fpxx<s2, e2>& right)
{
    //...
}

Обратите внимание, что тип возвращаемого значения должен быть зафиксирован во время компиляции.

...