一个模板函数,它接收std :: pair作为参数,并从括号列表初始化中推导类型

时间:2019-02-16 10:18:50

标签: c++ templates visual-c++ list-initialization

我正在尝试创建一个接收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 :(得分:1)

Initializer列表会引发所谓的“非推论上下文”,它们在模板自变量推论中不能很好地发挥作用。您可以改为提供额外的超载

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实现放到这个新函数模板的主体中。