Вывод типа шаблона в С++ для функции класса vs?
Почему этот автоматический вывод типа возможен только для функций, а не для классов?
Ответы
Ответ 1
В определенных случаях вы всегда можете сделать как std::make_pair
:
template<class T>
make_foo(T val) {
return foo<T>(val);
}
EDIT: Я только что нашел следующее в "Язык программирования С++, третье издание", стр. 335. Бьярне говорит:
Обратите внимание, что аргументы шаблона шаблона никогда не выведено. Причина в том, что гибкость обеспечивается несколькими конструкторы для класса такой вывод невозможно во многих случаев и неясных во многих других.
Это, конечно, очень субъективно. Об этом говорилось в comp.std.c++
, и, как представляется, консенсус заключается в том, что нет причин, по которым его нельзя было бы поддержать. Будет ли это хорошей идеей или нет, это другой вопрос...
Ответ 2
В собрание Kona Вывод параметра шаблона для конструкторов (P0091R0), что означает, что в С++ 17 мы сможем написать:
pair p1{"foo"s, 12};
auto p2 = pair{"foo"s, 12};
f(pair{"foo"s, 12});
Ответ 3
В случае вызова функции компилятор выводит тип шаблона из типа аргумента. Например, std:: max -функция. Компилятор использует тип аргументов для вывода параметра шаблона. Это не всегда работает, поскольку не все вызовы являются однозначными.
int a = 5;
float b = 10;
double result1 = std::min( a, b ); // error: template parameter ambigous
double result2 = std::min< double >( a, b ); // explicit parameter enforces use of conversion
В случае класса шаблона это может не всегда быть возможным. Возьмем, к примеру, этот класс:
template< class T>
class Foo {
public:
Foo();
void Bar( int a );
private:
T m_Member;
};
Тип T никогда не появляется в вызове какой-либо функции, поэтому компилятор вообще не имеет намека, какой тип следует использовать.
Ответ 4
Я думаю, что неявное преобразование типа применимо только к аргументам функции, поэтому компилятор может вывести его, чтобы сделать успешный вызов функции.
Но как он может определить, какой тип вы хотите иметь.
Мы должны ждать 4 таких дней, когда у нас есть компилятор на основе AI, чтобы читать наши мысли.