首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >一个模板化函数,接收std::结对作为参数,并从带括号的列表初始化中推断类型。

一个模板化函数,接收std::结对作为参数,并从带括号的列表初始化中推断类型。
EN

Stack Overflow用户
提问于 2019-02-16 10:18:49
回答 1查看 60关注 0票数 1

我正在尝试创建一个模板化函数,它接收一个std::偶数,并且我希望类型是

在调用带有大括号的列表初始化函数时,隐式推导而不指定它们。我尝试过以下代码,但它没有编译(我使用的是visual studio 2017)。

我希望有人能帮我把这件事做好。

谢谢。

代码语言:javascript
复制
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;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-16 10:26:47

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

代码语言:javascript
复制
template <typename Key, typename Value>
void foo(Key&& k, Value&& v)
{
   foo(std::make_pair(std::forward<Key>(k), std::forward<Value>(v)));
}

简单地将调用转发到原始函数模板,并且可以通过

代码语言:javascript
复制
foo(1.0, "some string");

注意,调用语法省略了大括号。当然,如果您希望只有一个模板,那么可以将原始的foo实现直接放到这个新函数模板的主体中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54722033

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档