Можно ли узнать тип выражения между двумя параметрами шаблона? - PullRequest
3 голосов
/ 02 мая 2019

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

Допустим, у меня есть матрица A с типом int и матрица B с двойным типом.

Когда мы добавляем эти две матрицы, мы должны получить матрицу C типа, которая получается из: int + double (в этом случае предпочтительным является double, чтобы избежать потери данных).

Я использую шаблон с двумя типами: T1 и T2 для обработки разных типов моих матриц, и я попытался использовать typeid, чтобы получить тип возвращаемой матрицы. Но поскольку typeid не работает с T1 и T2 (если я правильно понял), я застрял.

template<class T1, class T2> Matrix<T1> & operator+(Matrix<T1> Matrix1, Matrix<T2> Matrix2) {
    if(Matrix1.GetCol() != Matrix2.GetCol() || Matrix1.GetRows() != 
Matrix2.GetRows()){
        throw(EXC_DifferentDimensions);
    }

    Matrix<T3> * result = new Matrix<T3>(Matrix1.GetRows(), Matrix1.GetCol());

    for(unsigned int iRow = 0; iRow < Matrix1.GetRows(); iRow++){
        for(unsigned int iCol = 0; iCol < Matrix1.GetCol(); iCol++){
            result->SetElement(Matrix1.GetElement(iRow, iCol) + Matrix2.GetElement(iRow, iCol), iRow, iCol);
        }
    }
    return *result;
}

Можно ли заставить его работать или я застрял с залипанием определенного типа для возвращаемой матрицы?

1 Ответ

5 голосов
/ 02 мая 2019

Спросите C ++, что будет результатом T1 + T2:

template<class T1, class T2>
Matrix<decltype(std::declval<T1>() + std::declval<T2>()>&
operator+(Matrix<T1> Matrix1, Matrix<T2> Matrix2);

decltype(e) - тип неоцененного выражения e; std::declval<T>() имеет тип T (эта функция не должна появляться в потенциально оцененном контексте).

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