Эквивалентное поведение аргументов шаблона шаблона для шаблонов функций

Я пытаюсь написать код, подобный этому:

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);

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

1

Решение

Проблема с вашим кодом в том, что контейнеры, для которых вы хотите, чтобы это работало, — (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;
}
}

Живая демо

5

Другие решения

У меня нет доступа к компилятору сейчас, но я думаю, что-то вроде этого будет работать:

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;
}
}
1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector