接收std :: Pair作为参数并从支撑列表初始化中推论的模板函数

A templated function that receives std::pair as an argument and deduces the types from braced-list initialization

本文关键字:初始化 函数 列表 Pair std 参数 接收      更新时间:2023-10-16

我正在尝试创建一个接收std ::配对的模板功能,我希望类型为
当我调用用支撑列表初始化调用函数时,隐式推导而无需指定。我尝试了以下代码,但没有编译(我正在使用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实现直接放入此新功能模板的主体中。