Списки инициализаторов индуцируют так называемый «не выводимый контекст», они плохо работают с выводом аргументов шаблона.Вместо этого вы можете предоставить дополнительную перегрузку
template <typename Key, typename Value>
void foo(Key&& k, Value&& v)
{
foo(std::make_pair(std::forward<Key>(k), std::forward<Value>(v)));
}
, которая просто перенаправляет вызов вашему исходному шаблону функции и которая может быть вызвана с помощью
foo(1.0, "some string");
Обратите внимание, что синтаксис вызова опускает фигурные скобки.Конечно, вы можете поместить оригинальную реализацию foo
прямо в тело этого нового шаблона функции, если вы предпочитаете иметь только один шаблон.