Я пытаюсь написать код, подобный этому:
template <typename K, typename T, template <typename, typename> class C>
boost::optional<T> search(const C<K, T>& dict,
const K& key)
{
auto it = dict.find(key);
if (it != dict.end()) {
return it->second;
} else {
return boost::none;
}
}
Надежда состояла в том, чтобы иметь возможность вызывать вышеуказанную функцию на различных контейнерах. (std::[unordered_][multi]map)
с интерфейсом словаря, как:
std::map<std::string, Foo> strToFoo;
auto val = search(strToFoo);
Я знаю, что шаблоны функций не допускают параметры шаблона шаблона. Но есть ли другой способ добиться того же эффекта?
Проблема с вашим кодом в том, что контейнеры, для которых вы хотите, чтобы это работало, — (unordered_)(multi)map
— иметь 4 или 5 параметров шаблона, в то время как ваш код ожидает только 2. Используйте параметры шаблона шаблона и различные шаблоны вместе, чтобы учесть дополнительные параметры шаблона.
template <typename Key, typename Value,
template <typename, typename, typename...> class C,
typename... Args>
boost::optional<Value> search(const C<Key, Value, Args...>& dict,
const Key& key)
{
auto it = dict.find(key);
if (it != dict.end()) {
return it->second;
} else {
return boost::none;
}
}
У меня нет доступа к компилятору сейчас, но я думаю, что-то вроде этого будет работать:
template <typename T>
boost::optional<typename T::mapped_type>
search(const T& dict, const typename T::key_type& key)
{
auto it = dict.find(key);
if (it != dict.end()) {
return it->second;
} else {
return boost::none;
}
}