#include <iostream>
#include <memory>
struct foo_t {
foo_t() = delete;
foo_t(const foo_t&) = delete;
foo_t(int, float, const std::string& /*... whatever*/) {}
};
struct C {
C(double, char /*... whatever constructor arguments*/)
: foo(nullptr) {
// lenghty computations allowing to define a, b and c
int a = 0 /* ? */;
float b = 0 /* ? */;
std::string s /* ? */;
foo.reset(new foo_t(a,b,s));
// remaining computations...
}
std::unique_ptr<foo_t> foo;
};
// translate that into ->
std::tuple<int, float, std::string> precompute(double, char) {
// lenghty computations allowing to define a, b and c
int a = 0 /* ? */;
float b = 0 /* ? */;
std::string s /* ? */;
return {a, b, std::move(s)};
}
struct C2 {
C2(double d, char c /*... whatever constructor arguments*/)
: C2(d, c, precompute(d, c)) {}
C2(double, char, std::tuple<int, float, std::string>&& tpl)
: foo(std::get<0>(tpl), std::get<1>(tpl), std::get<2>(tpl)) {
// remaining computations...
}
foo_t foo;
};
int main() {
// your code goes here
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWVtb3J5PgoKc3RydWN0IGZvb190IHsKCWZvb190KCkgPSBkZWxldGU7Cglmb29fdChjb25zdCBmb29fdCYpID0gZGVsZXRlOwoJZm9vX3QoaW50LCBmbG9hdCwgY29uc3Qgc3RkOjpzdHJpbmcmIC8qLi4uIHdoYXRldmVyKi8pIHt9Cn07CgpzdHJ1Y3QgQyB7CglDKGRvdWJsZSwgY2hhciAvKi4uLiB3aGF0ZXZlciBjb25zdHJ1Y3RvciBhcmd1bWVudHMqLykKCTogZm9vKG51bGxwdHIpIHsKCQkvLyBsZW5naHR5IGNvbXB1dGF0aW9ucyBhbGxvd2luZyB0byBkZWZpbmUgYSwgYiBhbmQgYwoJCWludCBhICAgPSAwIC8qID8gKi87CgkJZmxvYXQgYiA9IDAgLyogPyAqLzsKCQlzdGQ6OnN0cmluZyBzIC8qID8gKi87CgkJZm9vLnJlc2V0KG5ldyBmb29fdChhLGIscykpOwoJCS8vIHJlbWFpbmluZyBjb21wdXRhdGlvbnMuLi4KCX0KCQoJc3RkOjp1bmlxdWVfcHRyPGZvb190PiBmb287Cn07CgovLyB0cmFuc2xhdGUgdGhhdCBpbnRvIC0+CgpzdGQ6OnR1cGxlPGludCwgZmxvYXQsIHN0ZDo6c3RyaW5nPiBwcmVjb21wdXRlKGRvdWJsZSwgY2hhcikgewoJCS8vIGxlbmdodHkgY29tcHV0YXRpb25zIGFsbG93aW5nIHRvIGRlZmluZSBhLCBiIGFuZCBjCgkJaW50IGEgICA9IDAgLyogPyAqLzsKCQlmbG9hdCBiID0gMCAvKiA/ICovOwoJCXN0ZDo6c3RyaW5nIHMgLyogPyAqLzsKCQlyZXR1cm4ge2EsIGIsIHN0ZDo6bW92ZShzKX07Cn0KCnN0cnVjdCBDMiB7CglDMihkb3VibGUgZCwgY2hhciBjIC8qLi4uIHdoYXRldmVyIGNvbnN0cnVjdG9yIGFyZ3VtZW50cyovKQoJOiBDMihkLCBjLCBwcmVjb21wdXRlKGQsIGMpKSB7fQoJCglDMihkb3VibGUsIGNoYXIsIHN0ZDo6dHVwbGU8aW50LCBmbG9hdCwgc3RkOjpzdHJpbmc+JiYgdHBsKQoJOiBmb28oc3RkOjpnZXQ8MD4odHBsKSwgc3RkOjpnZXQ8MT4odHBsKSwgc3RkOjpnZXQ8Mj4odHBsKSkgewoJCS8vIHJlbWFpbmluZyBjb21wdXRhdGlvbnMuLi4KCX0KCQoJZm9vX3QgZm9vOwp9OwoKCmludCBtYWluKCkgewoJLy8geW91ciBjb2RlIGdvZXMgaGVyZQoJcmV0dXJuIDA7Cn0=