Ahojte kolegovia, prisiel som si pre radu ku skusenejsim 

majme nasledujuci kod (vid nizsie), kde su 3 triedy (A,B,C) a k nim prisluchajuce funkcie (A_graph, B_graph a C_graph) - 3rd libka.
Posladal som si Builder a Helper class. Helper sluzi na inicializaciu dat, je narocny, tak sa oplati ho vyskladat iba raz (samozrejme, pre danu A/A_graph ...)
Riesim ako elegantnejsie vyriesit 
Helper constructor, a jeho privatneho clena 
unique_ptr<(A/B/C)> graph = 
make_unique<(A/B/C)>(A_graph/B_graph/C_graph("path")) Dakujem pekne za hinty!
M
#include <string>
#include <memory>
#include <type_traits>
using namespace std;
/* 3rd lib defs */
class A {
    /* .. */
};
A A_graph(const string & in) {
    A ret;
    /* ... */
    return ret;
};
class B {
    /* .. */
};
B B_graph(const string & in) {
    B ret;
    /* ... */
    return ret;
};
class C {
    /* .. */
};
C C_graph(const string & in) {
    C ret;
    /* ... */
    return ret;
};
/* Own classes */
class IResult {};
class XResult : IResult {};
class YResult : IResult {};
class ZResult : IResult {};
template <class G>
class Helper {
    private:
        unique_ptr<G> graph;
        /*
        unique_ptr<GraphCalculator> calc;
        unique_ptr<Contraction> conc;
        unique_ptr<Router> rtr;
        */
    public:
        Helper(const string & in){
            if(0){
            }else if constexpr (std::is_same<G, A>::value){
                graph = make_unique<A>(A_graph(in));
            }else if constexpr (std::is_same<G, B>::value){
                graph = make_unique<B>(B_graph(in));
            }else if constexpr (std::is_same<G, C>::value){
                graph = make_unique<C>(C_graph(in));
            }
            /* Some data - time consuming init and calculations 
            
            calc = make_unique<Contraction>(graph);
            ...
            */
        };
};
template <class R, class G>
class Builder {
    private:
        unique_ptr<Helper<G>> builder;
    public:
        unique_ptr<R> build(void){
            if(!builder)
                builder = make_unique<Helper<G>>("path");
            
            R ret;
            /* some stuff
            ...
            
            auto calculate = MySuperCalculateFunction(builder->conc->results());
            ret.append(route);
            
             ... */
           
            return make_unique<R>(ret);
        };
};
using XABuilder = Builder<XResult, A>;
int main(){
    XABuilder builder;
    auto A = builder.build();
    return 0;
};
AD: poprosim upravit nazov temy, netusim ako som to mal pomenovat