Шаблон вычета в C ++ 03
template <typename T> void foo(T) {}
int i;
float f;
foo (i); // deduces foo<int>
foo (f); // deduces foo<float>
Здесь компилятор видит foo(i)
и говорит себе: «T
часть foo
должна быть int
, чтобы соответствовать».
auto
довольно просто.
int foo ();
float bar ();
auto i = foo (); // i is an int
auto f = bar (); // f is a float
Компилятор видит auto i =
и говорит самому себе: «Правая сторона даёт int
, поэтому i
должен быть одним из них».
decltype
немного сложнее, своего рода мета-авто. decltype(x)
эквивалентно int
, если x
- int
, float
, если x
- float
и т. Д. Преимущество заключается в том, что вы можете использовать его в выражениях шаблонов.
int foo (float);
float foo (int);
template <typename T> void convert (std :: vector <T> input) {
std :: vector <decltype (foo(input[0]))> output;
output .push_back (foo (input [0])); // yeah, ok, not safe, meh
}
convert (std :: vector <int> ()); // Will create an output of type std::vector<float>
convert (std :: vector <float> ()); // Will create an output of type std::vector<int>
Здесь decltype (foo(input[0]))
- это float
, когда input
- это вектор int
, поскольку input[0]
- это int
, а перегрузка foo
, которая принимает int
, возвращает float
.