Шаблонная функция, которая получает std :: pair в качестве аргумента и выводит типы из инициализации списка фигурных скобок - PullRequest
0 голосов
/ 16 февраля 2019

Я пытаюсь создать шаблонную функцию, которая получает std :: pair, и я хочу, чтобы типы неявно выводились
без указания их при вызове функции с инициализацией в фигурном списке.Я попробовал следующий код, но он не компилируется (я использую Visual Studio 2017).
Я бы хотел помочь вам с этой работой.
Спасибо.

template <typename Key, typename Value>
void foo(std::pair<Key, Value> arg)
{}

int main()
{
    foo({1.0, "some string"}); // doesn't compile
    foo(std::pair{ 1.0, "some string" }); // compiles when I specify the type this way
    return 0;
}

1 Ответ

0 голосов
/ 16 февраля 2019

Списки инициализаторов индуцируют так называемый «не выводимый контекст», они плохо работают с выводом аргументов шаблона.Вместо этого вы можете предоставить дополнительную перегрузку

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 прямо в тело этого нового шаблона функции, если вы предпочитаете иметь только один шаблон.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...