我正在尝试创建一个接收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;
}

最佳答案

初始化程序列表会引发所谓的“非推论上下文”,它们在模板参数推论中不能很好地发挥作用。您可以改为提供额外的过载

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实现直接放入此新功能模板的主体中。

关于c++ - 一个模板函数,将std::pair作为参数接收并从括号列表初始化中推导类型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54722033/

10-11 22:46
查看更多