gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 15:07:50 24 4
gpt4 key购买 nike

使用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'

最佳答案

您可以采用两种方法。
使用类型删除的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的调用,因此存在一些性能开销。这可能可以忽略不计,但是如果这在程序的性能关键部分的紧密循环中发生,则可能会很重要。
call 站点的外观将与您现在拥有的完全一样:
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之前的编译器,则必须为 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();
}

关于c++ - 构造函数中使用lambda的C++类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62662214/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com