А как насчет преобразования Controller
в классе, который может рекурсивно управлять собой?
Упрощение: как насчет добавления updateValue()
и get()
в контроллер
void updateValue (int v0)
{ setValues(v0); }
auto get () const
{ return getValues(); }
Остается только для изменения функции toGet
для добавления одного значения или вектора значений, в зависимости от случаев.
Я имею в виду ... учитывая несколько перегруженных append()
методов следующим образом
static auto append (std::vector<int> & v0, std::vector<int> const & v1)
{ v0.insert(v0.end(), v1.cbegin(), v1.cend()); }
static auto append (std::vector<int> & v0, int i)
{ v0.emplace_back(i); }
Вы можете написать свой конструктор просто следующим образом
template <typename ... Cs>
Controller (Cs & ... cs)
: toSet{[&](int v){ (cs.updateValue(v), ...); }},
toGet{[&](auto & vs){ (append(vs, cs.get()), ...); }}
{ }
Ниже приведен полный пример компиляции
#include <vector>
#include <iostream>
#include <functional>
template <std::size_t>
class ClassTmpl
{
private:
int val;
public:
void updateValue (int v0)
{ val = v0; }
int get () const
{ return val; }
};
using ClassA = ClassTmpl<0u>;
using ClassB = ClassTmpl<1u>;
using ClassC = ClassTmpl<2u>;
using ClassD = ClassTmpl<3u>;
class Controller
{
private:
std::function<void(int)> toSet;
std::function<void(std::vector<int>&)> toGet;
static auto append (std::vector<int> & v0, std::vector<int> const & v1)
{ v0.insert(v0.end(), v1.cbegin(), v1.cend()); }
static auto append (std::vector<int> & v0, int i)
{ v0.emplace_back(i); }
public:
template <typename ... Cs>
Controller (Cs & ... cs)
: toSet{[&](int v){ (cs.updateValue(v), ...); }},
toGet{[&](auto & vs){ (append(vs, cs.get()), ...); }}
{ }
void setValues (int val)
{ toSet(val); }
void updateValue (int v0)
{ setValues(v0); }
auto getValues () const
{
std::vector<int> values;
toGet(values);
return values;
}
auto get () const
{ return getValues(); }
};
int main ()
{
ClassA A;
ClassB B;
ClassC C;
ClassD D;
Controller controller1(A, B);
Controller controller2(C, D);
Controller master(controller1, controller2);
master.setValues(20);
std::vector<int> getVals = master.getValues();
for ( auto const & e : getVals )
std::cout << e << ' ';
std::cout << std::endl;
}