从作为模板函数参数传递的std :: function推断返回值和参数类型?

哈维·埃利斯(Harvey Ellis)

我一直在四处寻找SO,但是找不到我一直在寻找的答案-这个问题可能最接近我的想法。

一句话:是否可以声明一个模板函数,该模板函数采用an的std::function参数并为该函数的返回类型和参数类型推导出模板参数?例:

//this works to pass the std::function in
template<class T>
void doSomething(std::function<T> f) {
    f();
}

//this is more what i am looking for - can R and P be deduced automatically - does not work!
template<class R, class P>
void doSomethingElse(std::function<R(P)> f) {
    f();
}

这是因为函数签名或函数类型本身被视为一件事情,因此不能被“分解”吗?我知道有decltypestd::result_of但无法思考如何在这里使用它们。

另外,如何使用可变参数模板将第二个示例扩展为具有多个参数和推导?

内森·奥利弗
template<class R, class P>
void doSomethingElse(std::function<R(P)> f) {
    f(P{});
}

可以,但是仅当您将a传递std::function给该函数并且该函数具有一个非void参数时才有效不过,这是一种限制。您可以使用

template<class R, class... Args, class... Ts>
void doSomethingElse(std::function<R(Args...)> f, Ts&&... args) {
    f(std::forward<Args>(args)...);
}

它将接受任何std::function和参数,并像在呼叫站点中一样进行调用。不过,这仍然是有限制的,因为致电网站要求您使用,std::function因此您无法将任何可隐式转换为的内容传递给std::function

使用C ++ 17和类模板参数推论(CTAD)时,这不再是问题。我们可以创建一个可以接受任何类型的重载,然后使用CTAD构造一个std :: function来为我们填充类型。看起来像

template<class Func, class... Args>
void doSomethingElse(Func&& f, Args&&... args) {
    doSomethingElse(std::function{std::forward<Func>(f)}, std::forward<Args>(args)...);
}

template<class R, class... Args, class... Ts>
void doSomethingElse(std::function<R(Args...)> f, Ts&&... args) {
    f(std::forward<Args>(args)...);
}

现在,不是a的所有内容std::function都将转到void doSomethingElse(Func&& f, Args&&... args),转换为std::function,然后传递给,void doSomethingElse(std::function<R(Args...)> f, Args&&... args)因此您可以在其中使用返回类型和参数类型。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将函数作为参数传递给模板返回值

来自分类Dev

传递任何函数作为模板参数

来自分类Dev

传递任何函数作为模板参数

来自分类Dev

传递内部函数作为模板参数

来自分类Dev

带返回值的泛型函数参数的TypeScript参数类型推断?

来自分类Dev

std :: vector作为模板函数参数

来自分类Dev

Typescript-类型函数,返回作为参数传递的每个函数的返回值的UNION

来自分类Dev

根据函数的返回值推断类型,其中函数参数是函数的记录

来自分类Dev

当期望的返回类型和返回值作为字符串参数传递时,比较方法的返回值

来自分类Dev

如何将std :: get作为参数传递给模板函数?

来自分类Dev

将std :: integer_sequence作为模板参数传递给元函数

来自分类Dev

从函数返回类型推断模板参数类型

来自分类Dev

将模板函数和重载作为函数参数传递

来自分类Dev

如何传递构造函数(可变参数)作为模板参数?

来自分类Dev

以默认参数值作为模板参数的传递函数

来自分类Dev

从传递的函数的返回值推断函数通用类型U

来自分类Dev

传递函数类型作为模板参数无法编译

来自分类Dev

将函数作为类型未知的类的模板参数传递

来自分类Dev

将函数指针作为非类型模板参数传递

来自分类Dev

根据模板参数的类型返回值

来自分类Dev

如何将函数作为模板参数传递,其中函数返回与模板参数相同?

来自分类Dev

将成员函数作为参数传递给函数模板

来自分类Dev

将模板函数作为普通函数的参数传递

来自分类Dev

C ++模板;作为模板参数传递的函数的自动推论返回类型;

来自分类Dev

为什么C#编译器无法推断出返回值的类型参数?

来自分类Dev

传递一个接受任意数量和类型参数的函数作为类模板参数

来自分类Dev

std :: function作为模板参数

来自分类Dev

Python:表示返回值和参数类型的标准方法

来自分类Dev

函数对象传递std :: get作为函数的参数

Related 相关文章

  1. 1

    将函数作为参数传递给模板返回值

  2. 2

    传递任何函数作为模板参数

  3. 3

    传递任何函数作为模板参数

  4. 4

    传递内部函数作为模板参数

  5. 5

    带返回值的泛型函数参数的TypeScript参数类型推断?

  6. 6

    std :: vector作为模板函数参数

  7. 7

    Typescript-类型函数,返回作为参数传递的每个函数的返回值的UNION

  8. 8

    根据函数的返回值推断类型,其中函数参数是函数的记录

  9. 9

    当期望的返回类型和返回值作为字符串参数传递时,比较方法的返回值

  10. 10

    如何将std :: get作为参数传递给模板函数?

  11. 11

    将std :: integer_sequence作为模板参数传递给元函数

  12. 12

    从函数返回类型推断模板参数类型

  13. 13

    将模板函数和重载作为函数参数传递

  14. 14

    如何传递构造函数(可变参数)作为模板参数?

  15. 15

    以默认参数值作为模板参数的传递函数

  16. 16

    从传递的函数的返回值推断函数通用类型U

  17. 17

    传递函数类型作为模板参数无法编译

  18. 18

    将函数作为类型未知的类的模板参数传递

  19. 19

    将函数指针作为非类型模板参数传递

  20. 20

    根据模板参数的类型返回值

  21. 21

    如何将函数作为模板参数传递,其中函数返回与模板参数相同?

  22. 22

    将成员函数作为参数传递给函数模板

  23. 23

    将模板函数作为普通函数的参数传递

  24. 24

    C ++模板;作为模板参数传递的函数的自动推论返回类型;

  25. 25

    为什么C#编译器无法推断出返回值的类型参数?

  26. 26

    传递一个接受任意数量和类型参数的函数作为类模板参数

  27. 27

    std :: function作为模板参数

  28. 28

    Python:表示返回值和参数类型的标准方法

  29. 29

    函数对象传递std :: get作为函数的参数

热门标签

归档