从std :: function调用签名中减去模板参数 [英] Deduce template argument from std::function call signature

查看:159
本文介绍了从std :: function调用签名中减去模板参数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

考虑这个模板函数:

  template< typename ReturnT> 
ReturnT foo(const std :: function< ReturnT()>& fun)
{
return fun();
}

为什么编译器不能推导 ReturnT

  bool bar(){/ * ... * /} 

foo< bool>酒吧); // works
foo(bar); //错误:没有匹配的函数调用


解决方案

std :: function< bool()>酒吧;

foo(bar); //工作正常

C ++无法从函数中推导出返回类型 bar ,因为它必须知道类型,然后才能找到所有的构造函数接受您的函数指针。



例如,说明 std :: function< std :: string()> 没有一个构造函数接受 bool code>?


Consider this template function:

template<typename ReturnT>
ReturnT foo(const std::function<ReturnT ()>& fun)
{
    return fun();
}

Why isn't it possible for the compiler to deduce ReturnT from the passed call signature?

bool bar() { /* ... */ }

foo<bool>(bar); // works
foo(bar); // error: no matching function call

解决方案

std::function<bool()> bar;

foo(bar); // works just fine

C++ can't deduce the return type from your function bar because it would have to know the type before it could find all the constructors that take your function pointer.

For example, who's to say that std::function<std::string()> doesn't have a constructor taking a bool (*)()?

这篇关于从std :: function调用签名中减去模板参数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆