构造函数中使用lambda的C ++类

丑女鲍勃

使用c ++ 11,我想创建一个使用lambda作为计算一部分的类。

//contrived sample of potential usage
void random_class::some_function(void)
{
 auto an_object = new my_custom_object(5, [this](){ return random_class_member * 5; });
 an_object.do_some_processing();
 random_class_member++;
 an_object.do_some_processing();
}

我不太确定如何声明和定义my_custom_object。

class my_custom_object
{
public:
 template <typename Proc>
 my_custom_object(int a, Proc p)
 {
  privatea = a;
  privatep = p;
 }
 void do_some_processing()
 {
  privatea += privatep();
 }
private:
 int privatea;
 Proc privatep;
}

未知类型名称'Proc'

迈尔斯·布德奈克(Miles Budnek)

您可以采用两种方法。

使用类型删除 std::function

例如:

class my_custom_object {
public:
    my_custom_object(int a, std::function<void()> p)
    {
        privatea = a;
        privatep = p;
    }
    void do_some_processing()
    {
        privatea += privatep();
    }

private:
    int privatea;
    std::function<void()> privatep;
};

这允许my_custom_object接受任何不接受参数的类似函数的事物。但是,由于privatep必须在运行时解决调用,因此存在一些性能开销这可能可以忽略不计,但是如果这在程序的性能关键部分的紧密循环中发生,则可能会很重要。

呼叫站点的外观将与您现在拥有的完全一样:

void random_class::some_function(void)
{
   my_custom_object an_object{5, [this](){ return random_class_member * 5; }};
   an_object.do_some_processing();
   random_class_member++;
   an_object.do_some_processing();
}

模板my_custom_object上包含的功能类型。

例如:

template <typename Proc>
class my_custom_object {
public:
    my_custom_object(int a, Proc p)
    {
        privatea = a;
        privatep = p;
    }
    void do_some_processing()
    {
        privatea += privatep();
    }

private:
    int privatea;
    Proc privatep;
};

这样一来,您的调用就privatep可以在编译时进行静态解析,这可能比使用时性能稍好std::function这确实意味着的类型Proc现在是my_custom_object尽管类型的一部分,所以在某些情况下它的灵活性较差。

由于C ++ 17添加了类模板参数推导,因此调用站点将看起来完全相同:

void random_class::some_function(void)
{
   my_custom_object an_object{5, [this](){ return random_class_member * 5; }};
   an_object.do_some_processing();
   random_class_member++;
   an_object.do_some_processing();
}

如果必须使用C ++ 17之前的编译器,则必须指定template参数来my_custom_object显式地:

void random_class::some_function(void)
{
   auto func = [this](){ return random_class_member * 5; };
   my_custom_object<decltype(func)> an_object{5, func};
   an_object.do_some_processing();
   random_class_member++;
   an_object.do_some_processing();
}

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在C ++中的类构造函数中使用线程?

来自分类Dev

在类构造函数中使用泛型

来自分类Dev

在Android中使用类构造函数

来自分类Dev

在构造函数中使用模板类

来自分类Dev

在类构造函数中使用时,Lambda不会隐式转换

来自分类Dev

无法在具有 lambda 字段的类的构造函数中使用 `return`

来自分类Dev

当父类在 C++ 中没有默认构造函数时,如何在继承的类中使用构造函数?

来自分类Dev

是否可以在构造函数C ++中使用可以在类中使用相同的变量?

来自分类Dev

在类javascript类构造函数中使用异步调用

来自分类Dev

在类构造函数中使用单独类的对象

来自分类Dev

子类调用基类构造函数,然后在子类Arduino C ++中使用基类的实例方法

来自分类Java

在抽象类的构造函数中使用抽象init()函数

来自分类Dev

如何在C ++中使用构造函数(只是构造函数)在类中初始化大型私有数组?

来自分类Dev

如何在C ++中的类外部定义lambda函数并在类中使用它?

来自分类Dev

如何在C ++中使用通用引用参数为模板类编写构造函数

来自分类Dev

如何在类构造函数中使用C ++ 11随机引擎和均匀分布?

来自分类Dev

在构造函数中使用类成员时的C ++未定义引用

来自分类Dev

在类C ++中使用构造函数为char数组提供默认值

来自分类Dev

如何在类构造函数中使用方法数据 c# xamarin

来自分类Dev

在Javascript类构造函数中使用jQuery事件处理程序

来自分类Dev

在继承的类构造函数中使用隐藏成员

来自分类Dev

React.js:在构造函数中使用类的组件

来自分类Dev

在构造函数中使用域类中的字段

来自分类Dev

在泛型中使用必需的构造函数继承类

来自分类Dev

在子类实例化中使用替代超类构造函数

来自分类Dev

Python:如何在Django Form类中使用构造函数?

来自分类Dev

在F#中使用私有构造函数创建类

来自分类Dev

何时/为什么在构造函数中使用JavaScript中的类?

来自分类Dev

在基类构造函数中使用派生类属性

Related 相关文章

  1. 1

    如何在C ++中的类构造函数中使用线程?

  2. 2

    在类构造函数中使用泛型

  3. 3

    在Android中使用类构造函数

  4. 4

    在构造函数中使用模板类

  5. 5

    在类构造函数中使用时,Lambda不会隐式转换

  6. 6

    无法在具有 lambda 字段的类的构造函数中使用 `return`

  7. 7

    当父类在 C++ 中没有默认构造函数时,如何在继承的类中使用构造函数?

  8. 8

    是否可以在构造函数C ++中使用可以在类中使用相同的变量?

  9. 9

    在类javascript类构造函数中使用异步调用

  10. 10

    在类构造函数中使用单独类的对象

  11. 11

    子类调用基类构造函数,然后在子类Arduino C ++中使用基类的实例方法

  12. 12

    在抽象类的构造函数中使用抽象init()函数

  13. 13

    如何在C ++中使用构造函数(只是构造函数)在类中初始化大型私有数组?

  14. 14

    如何在C ++中的类外部定义lambda函数并在类中使用它?

  15. 15

    如何在C ++中使用通用引用参数为模板类编写构造函数

  16. 16

    如何在类构造函数中使用C ++ 11随机引擎和均匀分布?

  17. 17

    在构造函数中使用类成员时的C ++未定义引用

  18. 18

    在类C ++中使用构造函数为char数组提供默认值

  19. 19

    如何在类构造函数中使用方法数据 c# xamarin

  20. 20

    在Javascript类构造函数中使用jQuery事件处理程序

  21. 21

    在继承的类构造函数中使用隐藏成员

  22. 22

    React.js:在构造函数中使用类的组件

  23. 23

    在构造函数中使用域类中的字段

  24. 24

    在泛型中使用必需的构造函数继承类

  25. 25

    在子类实例化中使用替代超类构造函数

  26. 26

    Python:如何在Django Form类中使用构造函数?

  27. 27

    在F#中使用私有构造函数创建类

  28. 28

    何时/为什么在构造函数中使用JavaScript中的类?

  29. 29

    在基类构造函数中使用派生类属性

热门标签

归档