#include <iostream>
#include <map>
#include <functional> // std::ref
#include <vector>
class Foo
{
public:
template <typename ...Ts>
Foo(Ts&&... ts) : Foo(std::map<char, std::vector<int>&>{std::forward<Ts>(ts)...}) {}
Foo(std::vector<int> (&v)[26]) :
A(v[0]),
B(v[1])
// and so on...
{
}
Foo(std::vector<int> &a, std::vector<int> &b) : A(a), B(b) // and so on...
{
}
Foo(const std::map<char, std::vector<int>&>& m) :
A(m.at('A')),
B(m.at('B'))
// and so on...
{
}
Foo(std::map<char, std::vector<int>&>&& m) :
A(m.at('A')),
B(m.at('B'))
// and so on...
{
}
virtual void DoSomething()
{
A.push_back(42);
std::cout << A[0] << std::endl;
}
private:
std::vector<int> &A, &B; //, &C, &D, &E, &F, &G; // and so on...
};
int main()
{
{
std::vector<int> v[26];
Foo foo(
std::make_pair('A', std::ref(v[0])),
std::make_pair('B', std::ref(v[1]))
// And so on...
);
foo.DoSomething();
std::cout << v[0][0] << std::endl;
}
{
std::vector<int> v[26];
Foo foo(v);
foo.DoSomething();
std::cout << v[0][0] << std::endl;
}
{
std::vector<int> v[26];
Foo foo(v[0], v[1]);
foo.DoSomething();
std::cout << v[0][0] << std::endl;
}
{
std::vector<int> v[26];
const std::map<char, std::vector<int>&> m {
std::make_pair('A', std::ref(v[0])),
std::make_pair('B', std::ref(v[1]))
// And so on...
};
Foo foo(m);
foo.DoSomething();
std::cout << v[0][0] << std::endl;
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWFwPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4gLy8gc3RkOjpyZWYKI2luY2x1ZGUgPHZlY3Rvcj4KCmNsYXNzIEZvbwp7CnB1YmxpYzoKICAgIHRlbXBsYXRlIDx0eXBlbmFtZSAuLi5Ucz4KICAgIEZvbyhUcyYmLi4uIHRzKSAgOiBGb28oc3RkOjptYXA8Y2hhciwgc3RkOjp2ZWN0b3I8aW50PiY+e3N0ZDo6Zm9yd2FyZDxUcz4odHMpLi4ufSkge30KCiAgICBGb28oc3RkOjp2ZWN0b3I8aW50PiAoJnYpWzI2XSkgOgogICAgQSh2WzBdKSwKICAgIEIodlsxXSkKICAgIC8vIGFuZCBzbyBvbi4uLgogICAgewogICAgfQoKICAgIEZvbyhzdGQ6OnZlY3RvcjxpbnQ+ICZhLCBzdGQ6OnZlY3RvcjxpbnQ+ICZiKSA6IEEoYSksIEIoYikgLy8gYW5kIHNvIG9uLi4uCiAgICB7CiAgICB9CgogICAgRm9vKGNvbnN0IHN0ZDo6bWFwPGNoYXIsIHN0ZDo6dmVjdG9yPGludD4mPiYgbSkgOgogICAgQShtLmF0KCdBJykpLAogICAgQihtLmF0KCdCJykpCiAgICAvLyBhbmQgc28gb24uLi4KICAgIHsKICAgIH0KICAgIEZvbyhzdGQ6Om1hcDxjaGFyLCBzdGQ6OnZlY3RvcjxpbnQ+Jj4mJiBtKSA6CiAgICBBKG0uYXQoJ0EnKSksCiAgICBCKG0uYXQoJ0InKSkKICAgIC8vIGFuZCBzbyBvbi4uLgogICAgewogICAgfQoKICAgIHZpcnR1YWwgdm9pZCBEb1NvbWV0aGluZygpCiAgICB7CiAgICAgICAgQS5wdXNoX2JhY2soNDIpOwogICAgICAgIHN0ZDo6Y291dCA8PCBBWzBdIDw8IHN0ZDo6ZW5kbDsKICAgIH0KCnByaXZhdGU6CiAgICBzdGQ6OnZlY3RvcjxpbnQ+ICZBLCAmQjsgLy8sICZDLCAmRCwgJkUsICZGLCAmRzsgLy8gYW5kIHNvIG9uLi4uCn07CgoKaW50IG1haW4oKQp7CiAgICB7CiAgICAgICAgc3RkOjp2ZWN0b3I8aW50PiB2WzI2XTsKCiAgICAgICAgRm9vIGZvbygKICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoJ0EnLCBzdGQ6OnJlZih2WzBdKSksCiAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKCdCJywgc3RkOjpyZWYodlsxXSkpCiAgICAgICAgICAgIC8vIEFuZCBzbyBvbi4uLgogICAgICAgICk7CgogICAgICAgIGZvby5Eb1NvbWV0aGluZygpOwogICAgICAgIHN0ZDo6Y291dCA8PCB2WzBdWzBdIDw8IHN0ZDo6ZW5kbDsKICAgIH0KICAgIHsKICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ+IHZbMjZdOwoKICAgICAgICBGb28gZm9vKHYpOwoKICAgICAgICBmb28uRG9Tb21ldGhpbmcoKTsKICAgICAgICBzdGQ6OmNvdXQgPDwgdlswXVswXSA8PCBzdGQ6OmVuZGw7CgogICAgfQogICAgewogICAgICAgIHN0ZDo6dmVjdG9yPGludD4gdlsyNl07CgogICAgICAgIEZvbyBmb28odlswXSwgdlsxXSk7CgogICAgICAgIGZvby5Eb1NvbWV0aGluZygpOwogICAgICAgIHN0ZDo6Y291dCA8PCB2WzBdWzBdIDw8IHN0ZDo6ZW5kbDsKCiAgICB9CiAgICB7CiAgICAgICAgc3RkOjp2ZWN0b3I8aW50PiB2WzI2XTsKICAgICAgICBjb25zdCBzdGQ6Om1hcDxjaGFyLCBzdGQ6OnZlY3RvcjxpbnQ+Jj4gbSB7CiAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKCdBJywgc3RkOjpyZWYodlswXSkpLAogICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcignQicsIHN0ZDo6cmVmKHZbMV0pKQogICAgICAgICAgICAvLyBBbmQgc28gb24uLi4KICAgICAgICB9OwogICAgICAgIEZvbyBmb28obSk7CgogICAgICAgIGZvby5Eb1NvbWV0aGluZygpOwogICAgICAgIHN0ZDo6Y291dCA8PCB2WzBdWzBdIDw8IHN0ZDo6ZW5kbDsKICAgIH0KICAgIHJldHVybiAwOwp9Cg==