得到std :: bind的结果类型

时间:2018-01-11 19:21:11

标签: c++ decltype result-of

我试图将结果类型的std :: bind与lambda结合起来。我尝试了以下两个:

template<typename F>
typename std::result_of<std::bind(F,uint)> func(F f, uint i);

这无论出于何种原因都无效。我也尝试过使用decltype:

template<typename F>
decltype(std::bind(F(),uint()) func(F f, uint i);

这不起作用,因为当我使用带有lambda f的模板函数时,它会抱怨lambdas有一个删除的默认构造函数。

你能帮帮我吗?我试图在网上找到答案却没有成功。

谢谢!

1 个答案:

答案 0 :(得分:5)

我建议使用decltype(auto),如下所示:

template<typename F>
decltype(auto) func(F f, uint i) { // ... }

因此返回类型将由编译器推断。

然后,我不认为std::result_of在这种情况下是合适的工具。

但是使用decltype,您可能也会完成@ Jarod42在评论中提到的内容:使用尾随返回类型

template<typename F>
auto func(F f, uint i) -> decltype(std::bind(f, i)) { // ... }

也适用于 C ++ 11 (第一个解决方案需要 C ++ 14 支持)。