#include <iostream>
#include <string>
class ConfigPair
{
protected:
std::string name;
public:
ConfigPair(const std::string &n) : name(n) { }
virtual std::string toString() const = 0;
};
class ConfigPairInt : public ConfigPair
{
int value;
public:
ConfigPairInt(const std::string &n, int v) : ConfigPair(n), value(v) { }
std::string toString() const override { return name + ":i[" + std::to_string(value) + "]"; }
};
class ConfigPairDouble : public ConfigPair
{
double value;
public:
ConfigPairDouble(const std::string &n, double v) : ConfigPair(n), value(v) { }
std::string toString() const override { return name + ":d[" + std::to_string(value) + "]"; }
};
class ConfigPairString : public ConfigPair
{
std::string value;
public:
ConfigPairString(const std::string &n, const std::string &v) : ConfigPair(n), value(v) { }
std::string toString() const override { return name + ":s[\"" + value + "\"]"; }
};
struct Config
{
template<typename... Ts>
Config(const Ts&... args)
{
const ConfigPair* arr[] = {&args...};
// use args as needed...
for (const ConfigPair* arg : arr) {
std::cout << arg->toString() << std::endl;
}
}
};
int main()
{
Config c2(
ConfigPairInt("one", 1),
ConfigPairDouble("two", 2.0),
ConfigPairString("three", "3")
);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgoKY2xhc3MgQ29uZmlnUGFpcgp7CnByb3RlY3RlZDoKCXN0ZDo6c3RyaW5nIG5hbWU7CnB1YmxpYzoKCUNvbmZpZ1BhaXIoY29uc3Qgc3RkOjpzdHJpbmcgJm4pIDogbmFtZShuKSB7IH0KCXZpcnR1YWwgc3RkOjpzdHJpbmcgdG9TdHJpbmcoKSBjb25zdCA9IDA7Cn07CgpjbGFzcyBDb25maWdQYWlySW50IDogcHVibGljIENvbmZpZ1BhaXIKewoJaW50IHZhbHVlOwpwdWJsaWM6CglDb25maWdQYWlySW50KGNvbnN0IHN0ZDo6c3RyaW5nICZuLCBpbnQgdikgOiBDb25maWdQYWlyKG4pLCB2YWx1ZSh2KSB7IH0KCXN0ZDo6c3RyaW5nIHRvU3RyaW5nKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gbmFtZSArICI6aVsiICsgc3RkOjp0b19zdHJpbmcodmFsdWUpICsgIl0iOyB9Cn07CgpjbGFzcyBDb25maWdQYWlyRG91YmxlIDogcHVibGljIENvbmZpZ1BhaXIKewoJZG91YmxlIHZhbHVlOwpwdWJsaWM6CglDb25maWdQYWlyRG91YmxlKGNvbnN0IHN0ZDo6c3RyaW5nICZuLCBkb3VibGUgdikgOiBDb25maWdQYWlyKG4pLCB2YWx1ZSh2KSB7IH0KCXN0ZDo6c3RyaW5nIHRvU3RyaW5nKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gbmFtZSArICI6ZFsiICsgc3RkOjp0b19zdHJpbmcodmFsdWUpICsgIl0iOyB9Cn07CgpjbGFzcyBDb25maWdQYWlyU3RyaW5nIDogcHVibGljIENvbmZpZ1BhaXIKewoJc3RkOjpzdHJpbmcgdmFsdWU7CnB1YmxpYzoKCUNvbmZpZ1BhaXJTdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcgJm4sIGNvbnN0IHN0ZDo6c3RyaW5nICZ2KSA6IENvbmZpZ1BhaXIobiksIHZhbHVlKHYpIHsgfQoJc3RkOjpzdHJpbmcgdG9TdHJpbmcoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBuYW1lICsgIjpzW1wiIiArIHZhbHVlICsgIlwiXSI7IH0KfTsKCnN0cnVjdCBDb25maWcKewoJdGVtcGxhdGU8dHlwZW5hbWUuLi4gVHM+CglDb25maWcoY29uc3QgVHMmLi4uIGFyZ3MpCgl7CgkJY29uc3QgQ29uZmlnUGFpciogYXJyW10gPSB7JmFyZ3MuLi59OwoJCS8vIHVzZSBhcmdzIGFzIG5lZWRlZC4uLgoJCWZvciAoY29uc3QgQ29uZmlnUGFpciogYXJnIDogYXJyKSB7CgkJCXN0ZDo6Y291dCA8PCBhcmctPnRvU3RyaW5nKCkgPDwgc3RkOjplbmRsOwoJCX0KCX0KfTsKCmludCBtYWluKCkKewoJQ29uZmlnIGMyKAoJCUNvbmZpZ1BhaXJJbnQoIm9uZSIsIDEpLAogICAgICAgIENvbmZpZ1BhaXJEb3VibGUoInR3byIsIDIuMCksCiAgICAgICAgQ29uZmlnUGFpclN0cmluZygidGhyZWUiLCAiMyIpCgkpOwoJcmV0dXJuIDA7Cn0=