Как я могу получить тип вывода для функции шаблона? - PullRequest
0 голосов
/ 11 февраля 2019

Я запутался с моей функцией умножения на основе шаблонов с двумя входами и типом, который должен быть получен.Как я должен получить тип функции?

template<typename T, typename U>
DERIVED_TYPE multiply(T t, U u) {
    return t * u;
}

Хорошо, я знаю, что auto или decltype(auto) делает работу довольно хорошо, но я хотел бы, если смогу, другой способ, изучениеодна причина.Например, для Eigen

DERIVED_TYPE multiply(Matrix<int, 2, 3> t, Matrix<double, 3, 4> u) {
    return t * u;
}

DERIVED_TYPE должно быть, конечно, Matrix<double, 2, 4>.

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

В C ++ 11 вы можете использовать саму операцию для определения типа возвращаемого значения через спецификатор decltype вместе со спецификатором auto

template<typename T, typename U>
auto multiply(T const &t, U const &u) -> decltype(t * u)
{
    return t * u;
}

В C ++ 14 вы можете опустить завершающий тип возврата в объявлении функции

template<typename T, typename U>
auto multiply(T const &t, U const &u)
{
    return t * u;
}

В C ++ 20 вы можете опустить спецификатор template ииспользуйте сокращенный шаблон функции синтаксис

auto multiply(auto const &t, auto const &u)
{
    return t * u;
}

Кстати, я привел аргументы const &, чтобы избежать копирования больших типов.

0 голосов
/ 11 февраля 2019

В данном конкретном случае:

DERIVED_TYPE multiply(Matrix<int, 2, 3> t, Matrix<double, 3, 4> u) {
    return t * u;
}

вы можете использовать std::common_type для получения общего типа double и int:

Matrix< std::common_type<int,double> , 2 , 4>

В целом:

template <typename T1, typename T2, size_t m,size_t n,size_t p>
Matrix< std::common_type<T1,T2>, m,p> multiply( Matrix<T1,m,n>, Matrix<T2,n,p>) {
    //...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...