2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Как запретить выведение типа в шаблоне С++
Сообщение30.11.2018, 04:59 
Пример:
Код:
template<typename T>
void foo(T &x, T y) {
    x = y;
}

Если затем я напишу
Код:
unsigned char a;
foo(a, 0);

компилятор выведет ошибку, потому что он вывел тип T для первого аргумента как unsigned char, а для второго int.

Есть ли способ заставить компилятор не выводить тип второго аргумента, а и пользовать ужн выведенный из первого аргумента тип T?

Ограничения: С++ не новее c++14, нет STL (компилятор avr-g++).

 
 
 
 Re: Как запретить выведение типа в шаблоне С++
Сообщение30.11.2018, 10:19 
Надо поместить тип второго аргумента в т.н. non-deduced context:

код: [ скачать ] [ спрятать ]
Используется синтаксис C++
#include <iostream>


template <typename T>
struct identity
{
    using type = T;
};

template <typename T>
using identity_t = typename identity<T>::type;


template <typename T>
void foo(T& x, identity_t<T> y)
{
    x = y;
}

int main()
{
    unsigned char a;
   
    foo(a, 65);
   
    std::cout << "a = " << a << std::endl;
}

Alias template identity_t здесь нужен только для сокращения и очищения кода (если подобных мест у Вас несколько). Вместо него везде, где нужен non-deduced context для параметра шаблона T, можно просто писать typename identity<T>::type (хотя выглядит это не слишком просто :-) ).

 
 
 
 Re: Как запретить выведение типа в шаблоне С++
Сообщение30.11.2018, 10:53 
Спасибо. Я тут ещё нагуглил, что шаблоны поддерживают параметры по умолчанию. Если сделать так
Код:
template <typename T, typename U = T>
void foo(T &x, U y) { x = y; }

это будет работать? Сейчас нет доступа к компьютеру, чтобы проверить.

 
 
 
 Re: Как запретить выведение типа в шаблоне С++
Сообщение30.11.2018, 13:04 
Нет, так работать не будет.

 
 
 
 Re: Как запретить выведение типа в шаблоне С++
Сообщение30.11.2018, 18:43 
Ещё вариант:
Код:
template<typename T>
void foo(T &x, decltype(T{}) y)

Лаконично, но тип должен быть default-constructible.

 
 
 
 Re: Как запретить выведение типа в шаблоне С++
Сообщение30.11.2018, 18:56 
Аватара пользователя
user14284 в сообщении #1357663 писал(а):
Код:
template <typename T, typename U = T>
void foo(T &x, U y) { x = y; }

это будет работать?
EtCetera в сообщении #1357695 писал(а):
Нет, так работать не будет.
Работать будет, но инстанцируется в результате foo<char, int>.

 
 
 [ Сообщений: 6 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group