Вывод типа шаблона в C ++ для класса против функции? - PullRequest
15 голосов
/ 17 декабря 2009

Почему этот автоматический вывод типа возможен только для функций, а не для классов?

Ответы [ 4 ]

17 голосов
/ 17 декабря 2009

В определенных случаях вы всегда можете сделать как std::make_pair:

template<class T>
make_foo(T val) {
    return foo<T>(val);
}

РЕДАКТИРОВАТЬ: Я только что нашел следующее в "Язык программирования C ++, третье издание", стр. 335. Бьярне говорит:

Обратите внимание, что аргументы шаблона класса никогда не выводил. Причина в том, что гибкость, обеспечиваемая несколькими конструкторы для класса сделали бы такой вывод невозможен во многих случаи и неясны во многих других.

Это, конечно, очень субъективно. В comp.std.c++ было некоторое обсуждение этого вопроса, и, похоже, все согласны с тем, что нет никаких причин, по которым нельзя поддерживать. Будет ли это хорошей идеей или нет - это другой вопрос ...

9 голосов
/ 17 января 2016

На Совещании Kona Утверждение параметра шаблона для конструкторов ( P0091R0 ) было одобрено, что означает, что в C ++ 17 мы сможем написать:

pair p1{"foo"s, 12};
auto p2 = pair{"foo"s, 12};
f(pair{"foo"s, 12});
4 голосов
/ 17 декабря 2009

В случае вызова функции компилятор определяет тип шаблона из типа аргумента. Например, функция 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 никогда не появляется ни в одном вызове функции, поэтому у компилятора нет никаких подсказок, какой тип следует использовать.

1 голос
/ 17 декабря 2009

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

Но как он может определить, какой тип вы хотите, чтобы он был классом?

Нам нужно подождать 4 дня, когда у нас будет компилятор на основе ИИ , чтобы прочитать наши мысли.

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