【发布时间】:2019-04-30 17:09:35
【问题描述】:
我已将我的方法从 my original question 更改为模板化整个类并将其放置在可变参数元组中。我现在可以按照我希望创建的方式使用 getter 和 setter。但是,现在我正试图向前迈出一步,将各个控制器组合成一个控制器。
#ifndef CONTROLLER_HPP
#define CONTROLLER_HPP
#include <functional>
#include <vector>
#include <iostream>
#include <utility>
template<typename...Classes>
class Controller
{
public:
Controller(Classes&...objects) : objects(objects...){}
void setValues(int value)
{
std::apply([&](auto&...x) { (x.updateValue(value),...);}, objects);
}
void getValues(std::vector<int> &values)
{
std::apply([&](auto&...x) { (values.push_back(x.get()),...);}, objects);
}
private:
std::tuple<Classes&...> objects;
};
#endif
有了这个,我可以做到以下几点:
classA A;
classB B;
classC C;
classD D;
classE E;
classF F;
classG G;
Controller controller1(A,B,C);
Controller controller2(D,E);
Controller controller3(F,G);
controller1.setValues(20);
controller2.setValues(13);
controlelr3.setValues(32);
但是,我想更进一步,像这样将两者结合起来:
Controller master(controller1,controller2,controller3);
master.setValues(40);
我看过at this post talking about joining variadic templates,但是我认为这会返回一个类型(?)而不是一个类。我还尝试创建两个重载类,但我认为我没有正确创建重载:
template<typename...Classes>
class Controller
{
public:
Controller(Classes&...objects) : objects(objects...){}
void setValues(int value)
{
std::apply([&](auto&...x) { (x.updateValue(value),...);}, objects);
}
void getValues(std::vector<int> &values)
{
std::apply([&](auto&...x) { (values.push_back(x.get()),...);}, objects);
}
private:
std::tuple<Classes&...> objects;
};
template<Controller<typename ... > class Controllers, typename ...Classes>
class Controller<Controllers<Classes&...classes>...>
{
// create a new controller that takes all the combined classes
};
如何将任意数量的模板化可变参数模板类组合成一个类?我确实有能力使用 C++17。
【问题讨论】:
-
用重载的
operator()创建一个函子,一个负责处理或Controller<...>s,一个负责处理其他任何事情。然后你可以将它传递给std::apply而不是你当前的 lambda。 -
@super 你想举个例子吗?
-
@super 这将要求子控制器的生命周期无实际原因超过主控制器。
标签: c++ templates c++17 variadic-templates