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

标签 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;
}

最佳答案

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

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/

相关文章:

c++ - 结构映射之前的声明符无效?

angular - 在 Angular 模板中访问联合类型的属性

c++ -/Ox 和/O2 编译器选项有什么区别?

windows - 如何使用 procdump -t -- 在进程终止时转储?

c++ - Windows应用程序中的键盘类实现

c++ - 如何引用其他类的函数来为 vector 添加值

c++ - 在 Windows 上构建 LLVM 时出错 - LNK1104

c++ - std::bind 是否忽略了符合标准的多余参数?

c++ - 将成员函数指针作为模板参数传递

c++ - 模板类中模板类的结构体