Форум программистов, компьютерный форум CyberForum.ru

Возвращаемый тип шаблона через std::common_type - C++

Восстановить пароль Регистрация
 
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
08.12.2012, 13:11     Возвращаемый тип шаблона через std::common_type #1
Вот отрывок моего кода. Не могу понять как определить возвращаемый тип объекта matrix.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
template<typename V, typename U, size_t R, size_t C>
matrix</*U или V*/,R,C> operator+(const V& value, const matrix<U,R,C>& rhs)                     //!matrix+matrix
{
    std::cout<<"!matrix+matrix\n";
    std::cout<<"common_type<V,U>::type = "<<typeid(std::common_type<V,U>::type).name()<<std::endl;
    if (!std::is_fundamental<V>::value) throw std::logic_error ("Не совместимый тип при операции +\n");
    else
    {
        matrix<std::common_type<V,U>::type,R,C> ret_matrix(rhs);
        ret_matrix+=value;
        return ret_matrix;
    }
}
Такое не проходит:
C++
1
2
template<typename V, typename U, size_t R, size_t C>
matrix<std::common_type<V,U>::type,R,C> operator+(const V& value, const matrix<U,R,C>& rhs) {...}
Через auto тоже не проходит.
Как это правильно сделать?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
08.12.2012, 13:32     Возвращаемый тип шаблона через std::common_type #2
Цитата Сообщение от yuron_477 Посмотреть сообщение
std::common_type<V,U>::type
typename std::common_type<V,U>::type.
Это как минимум, т.к. type - зависимый от U и V тип.

Добавлено через 11 минут
Цитата Сообщение от yuron_477 Посмотреть сообщение
if (!std::is_fundamental<V>::value) throw std::logic_error ("Не совместимый тип при операции +\n");
Кстати, вместо
C++
1
if (!std::is_fundamental<V>::value) throw std::logic_error ("Не совместимый тип при операции +\n");
логичнее было бы
C++
1
static_assert(std::is_fundamental<V>::value, "Не совместимый тип при операции +.");
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
08.12.2012, 13:37  [ТС]     Возвращаемый тип шаблона через std::common_type #3
static_assert приму к сведению, а вот относительно typename std::common_type<V,U>::type чета я не понял, где его определять?
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
08.12.2012, 13:51     Возвращаемый тип шаблона через std::common_type #4
yuron_477, например здесь:
Цитата Сообщение от yuron_477 Посмотреть сообщение
matrix</*U или V*/,R,C>
C++
1
matrix<typename std::common_type<U, V>::type, R, C>
вообщем везде, где использушь std::common_type, и вообще с любыми типами, которые зависят от параметра шаблона, нужен typename. Компилятор не в курсе, что такое type - тип, статический метод или ещё что-нибудь, надо явно это указывать.
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
08.12.2012, 14:14  [ТС]     Возвращаемый тип шаблона через std::common_type #5
Да, все заработало. Вообщем, репект и уважуха
Окончательный вариант:
C++
1
2
3
4
5
6
7
8
9
10
template<typename V, typename U, size_t R, size_t C>
matrix<typename std::common_type<U, V>::type,R,C> operator+(const V& value, const matrix<U,R,C>& rhs)                       //!matrix+matrix
{
    //std::cout<<"!matrix+matrix\n";
    //std::cout<<"common_type<V,U>::type = "<<typeid(typename std::common_type<U, V>::type).name()<<std::endl;
    static_assert(std::is_fundamental<V>::value, "Не совместимый тип при операции +.");
    matrix<typename std::common_type<U, V>::type,R,C> ret_matrix(rhs);
    ret_matrix+=value;
    return ret_matrix;
}
Еще, походу, спрошу про static_assert - как его правильно обрабатывать при срабатывании?
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
08.12.2012, 14:22     Возвращаемый тип шаблона через std::common_type #6
Цитата Сообщение от yuron_477 Посмотреть сообщение
static_assert - как его правильно обрабатывать при срабатывании?
Всмысле? static_assert - это как assert, только времени компиляции. Если его первый параметр - false, то будет ошибка компиляции с сообщением из его второго параметра. Смысл в том, что std::is_fundamental<V>::value вычисляется на этапе компиляции, и помоему лучше ловить такие штуки во время компиляции вместо времени выполнения (например, бросать исключение, как в твоём примере).
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.12.2012, 14:37     Возвращаемый тип шаблона через std::common_type
Еще ссылки по теме:

C++ Перегруженные функции. Возвращаемый тип
C++ Возвращаемый тип конструктора копирования в абстрактном классе
Выбор значения для шаблона, bool отделить от std::is_integral C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
08.12.2012, 14:37  [ТС]     Возвращаемый тип шаблона через std::common_type #7
Понял, уже разобрался.
Yandex
Объявления
08.12.2012, 14:37     Возвращаемый тип шаблона через std::common_type
Ответ Создать тему
Опции темы

Текущее время: 02:14. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru