接收 std::pair 作为参数并从花括号列表初始化推导出类型的模板化函数

Posted

技术标签:

【中文标题】接收 std::pair 作为参数并从花括号列表初始化推导出类型的模板化函数【英文标题】:A templated function that receives std::pair as an argument and deduces the types from braced-list initialization 【发布时间】:2019-02-16 10:18:49 【问题描述】:

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

初始化列表引入了所谓的“非推导上下文”,它们不能很好地与模板参数推导配合使用。您可以改为提供额外的重载

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

【讨论】:

以上是关于接收 std::pair 作为参数并从花括号列表初始化推导出类型的模板化函数的主要内容,如果未能解决你的问题,请参考以下文章

使用固定类型生成std :: pair的宏

为啥 std::array<std::pair<int,int>, 3> 不能使用嵌套初始化列表初始化,但 std::vector<std::pair<int,in

std::pair<vector<int>, double> 的初始化列表

为啥 std::pair 对于 const 引用和转发引用参数有两个不同的构造函数?

宏 MOCK_METHOD 传递了 3 个参数,但 std::pair 仅出现 2 个错误

我应该如何大括号初始化 std::pairs 的 std::array?