Следующая игрушечная программа преобразует тип музыки в соответствующий цвет. Он компилирует и выполняет только штраф - преобразование COUNTRY
не выполняется, как и ожидалось, и функция conversion()
возвращает значение по умолчанию, WHITE
. Однако, если я удаляю аргументы шаблона, <MUSIC, COLOR>
, вывод аргумента шаблона не распознает, какие типы использовать. Как я могу заставить дедукцию работать?Почему не работает вывод шаблона?
#include <map>
#include <iostream>
#include "boost/assign.hpp"
template<typename Key, typename T>
T convert(const Key &k, const T &d, const std::map<Key, T> &m) {
typename std::map<Key, T>::const_iterator it = m.find(k);
return it == m.end() ? d : it->second;
}
enum MUSIC { ROCK, RAP, EDM, COUNTRY };
enum COLOR { RED, BLUE, ORANGE, WHITE };
int main()
{
COLOR c = convert<MUSIC, COLOR>(COUNTRY, WHITE,
boost::assign::map_list_of (RAP, RED) (EDM, BLUE) (ROCK, RED));
std::cout << c << std::endl;
}
Что произойдет, если вы добавите аргумент шаблона для типа карты, а? – jxh
template Map, typename Key, typename Value>> ... согласно предложению @ jxh? – mrtimdog