使用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
必须在运行时解决调用,因此存在一些性能开销。这可能可以忽略不计,但是如果这在程序的性能关键部分的紧密循环中发生,则可能会很重要。
呼叫站点的外观将与您现在拥有的完全一样:
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] 删除。
我来说两句