#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;
}