良好实践:从lambda构造一个复杂成员
Good practice : construction of a complex member from a lambda
我有时会在我的类中使用这种模式:
class Variant;
struct Foo
{
int x;
int y;
};
struct Bar
{
int first() const;
int second() const;
};
class Bar
{
public:
Bar(Variant v)
{
// For brevity there are no
// tests in this sample code
Bar aBar = v.get<Bar>(); // Variant::get is a slow operation
m_theFoo.x = aBar.first();
m_theFoo.x = aBar.second();
}
private:
Foo m_theFoo;
};
我宁愿在初始化列表中初始化m_theFoo。但是,我不想像这样两次调用Variant::get
,因为它可能是一个很慢的操作:
Bar(Variant v):
m_theFoo{v.get<Bar>().first(), v.get<Bar>().second()}
{
}
所以我想到了这个:
Bar(Variant v):
m_theFoo{[&] () {
Bar aBar = v.get<Bar>();
return Foo{aBar.first(), aBar.second()};
}()
}
{
}
基本上,初始化是由被调用的lambda完成的,并返回初始化的成员。
我想知道这听起来是否像一个好/坏的做法,如果有这个初始化方法的缺点。例如,lambda实例化的权重是多少?
让它像这样成为一个无状态的lambda会更好吗?
Bar(Variant v):
m_theFoo{[] (const Variant& v_sub) {
Bar aBar = v_sub.get<Bar>();
return Foo{aBar.first(), aBar.second()};
}(v)
}
{
}
只需将您的初始化转发到一个函数-您可以获得所有的好处,而不会因为有点神秘而使您的代码看起来很奇怪:
Bar(Variant v)
: m_theFoo(makeFoo(v))
{ }
:
Foo makeFoo(const Variant& v) {
Bar theBar = v.get<Bar>();
return Foo{theBar.first(), theBar.second()};
}
相关文章:
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- C++ - 如何在结构向量中找到结构体一个成员的最大值?
- 无法将指向类的成员函数的函数指针作为参数传递给同一类的另一个成员函数
- 使用只有一个成员的工会的目的是什么?
- 访问从联合与另一个成员集复制的联合中的一个成员是否未定义或未指定?
- std::mutex作为一个成员变量对多个线程来说是安全的吗
- 使用线程从另一个成员函数调用一个Member函数
- 如何通过指针将模板成员函数传递给另一个成员函数
- 只有一个成员的匿名联盟
- 复制一个对象并使两者共享一个成员变量 (C++)
- 初始化指针或引用成员变量以指向另一个成员
- 在另一个成员函数中调用成员函数时'int'之前的预期主表达式
- C 将成员函数作为参数传递给另一个成员函数
- 将结构编写为二进制,其中一个成员是字符串
- 如何在另一个成员函数中修改具有常量返回类型的成员函数的返回值
- 从其后声明的另一个成员数据初始化成员数据是否为未定义行为
- 如何使一个成员变量等于在main()中设置的另一个成员变量
- 在另一个成员中动态添加类成员
- 在对结构数组的一个成员进行排序后,移动其成员的其余部分
- 将类成员函数作为参数从同一类的另一个成员函数传递