从构造函数初始化列表中的一对初始化
Initializing from a pair in constructur intializer list
我有一个函数 f
返回一对 classes A
和 B
:
的对象
auto f() -> std::pair<A,B>;
此外,我有一个 class C
有 A
和 B
作为成员:
class C {
public:
C();
private:
A a;
B b;
};
在C
的构造函数中,我想使用成员初始化器列表并用f
的输出进行初始化:
C(): a(f().first), b(f().second) {}
虽然这会调用 f
两次,但它是一个相当复杂的函数。
有没有一种方法可以在不调用 f
两次的情况下使用成员初始化列表来实现这一点?不幸的是,C
的内部结构无法更改。
一种可能的解决方案:
class C {
public:
C(std::pair<A,B>);
private:
...
};
C(pair<A,B> p): a(p.first), b(p.second) {}
您现在只需调用 f
一次,只要它不与其他一些要求相矛盾,它就可以工作。
改进 的想法:
class C
{
A a;
B b;
C(std::pair<A,B> &&pair) : a(std::move(pair.first)), b(std::move(pair.second)) {}
public:
C() : C(f()) {}
};
我有一个函数 f
返回一对 classes A
和 B
:
auto f() -> std::pair<A,B>;
此外,我有一个 class C
有 A
和 B
作为成员:
class C {
public:
C();
private:
A a;
B b;
};
在C
的构造函数中,我想使用成员初始化器列表并用f
的输出进行初始化:
C(): a(f().first), b(f().second) {}
虽然这会调用 f
两次,但它是一个相当复杂的函数。
有没有一种方法可以在不调用 f
两次的情况下使用成员初始化列表来实现这一点?不幸的是,C
的内部结构无法更改。
一种可能的解决方案:
class C {
public:
C(std::pair<A,B>);
private:
...
};
C(pair<A,B> p): a(p.first), b(p.second) {}
您现在只需调用 f
一次,只要它不与其他一些要求相矛盾,它就可以工作。
改进
class C
{
A a;
B b;
C(std::pair<A,B> &&pair) : a(std::move(pair.first)), b(std::move(pair.second)) {}
public:
C() : C(f()) {}
};