Я робкий пользователь с шаблоном и обычно выполняю обычные примеры случаев.как компилятор вычислил типы шаблонов с карты
поэтому, я очень удивлен, увидев следующий код.
template<typename Table> void set(Table& tbl,
const typename Table::key_type& key,
const typename Table::mapped_type& attr)
{
typename Table::iterator iter = tbl.find(key);
if (iter != tbl.end()) {
iter->second = attr;
} else {
typedef typename Table::key_type TableKey;
typedef typename Table::mapped_type TableNonKey;
tbl.insert(std::pair<TableKey,TableNonKey>(key,attr));
}
}
template<typename Table> void show(Table& tbl)
{
for (typename Table::iterator iter = tbl.begin();
iter != tbl.end(); ++iter) {
cout << iter->second << endl;
}
}
int main(){
std::map<int, int> table_obj;
set(table_obj, 1, 2);
show(table_obj);
}
Как компилятор знает, что таблица является станд :: карта и возможность вычитать из таблицы :: key_type и таблицу :: mapped_type из него, когда речь идет о компиляции шоу/установить функцию? Существуют ли другие аналогичные примеры использования с шаблоном?
компилятор узнает, что 'Table' должен быть' станд :: Карта 'через процесс называется [шаблон вывод аргумента] (http://en.cppreference.com/w/cpp/language/template_argument_deduction) –
key_type и mapped_type - typedefs в классе карты. В качестве параметра шаблона можно использовать любой класс, который имеет эти typedefs и функции, которые вы вызываете, такие как find и end. –
Обратите внимание, что 'Таблица :: key_type' и' Таблица :: mapped_type' не подлежат вычету (но «Таблица» была ранее вычтена). – Jarod42