A small merge function applies an override while keeping the default config intact.

Config Merge

config_merge.cpp
#include <iostream>

struct Config {
    int retries;
    int timeout;
};

Config mergeConfig(Config base, int overrideTimeout) {
    if (overrideTimeout > 0) {
        base.timeout = overrideTimeout;
    }
    return base;
}

int main() {
    int overrideTimeout = ;

    Config base{3, 30};
    Config active = mergeConfig(base, overrideTimeout);
    int waitBudget = active.retries * active.timeout;

    std::cout << "timeout=" << active.timeout << std::endl;
    std::cout << "waitBudget=" << waitBudget << std::endl;
    return 0;
}
#include <iostream>

struct Config {
    int retries;
    int timeout;
};

Config mergeConfig(Config base, int overrideTimeout) {
    if (overrideTimeout > 0) {
        base.timeout = overrideTimeout;
    }
    return base;
}

int main() {
    int overrideTimeout = ;

    Config base{3, 30};
    Config active = mergeConfig(base, overrideTimeout);
    int waitBudget = active.retries * active.timeout;

    std::cout << "timeout=" << active.timeout << std::endl;
    std::cout << "waitBudget=" << waitBudget << std::endl;
    return 0;
}
#include <iostream>

struct Config {
    int retries;
    int timeout;
};

Config mergeConfig(Config base, int overrideTimeout) {
    if (overrideTimeout > 0) {
        base.timeout = overrideTimeout;
    }
    return base;
}

int main() {
    int overrideTimeout = ;

    Config base{3, 30};
    Config active = mergeConfig(base, overrideTimeout);
    int waitBudget = active.retries * active.timeout;

    std::cout << "timeout=" << active.timeout << std::endl;
    std::cout << "waitBudget=" << waitBudget << std::endl;
    return 0;
}
base config Start with a known base configuration so missing overrides still have useful values.
override Apply an override only when it is present and valid for the project rule.