当构造函数采用自身时解压缩可变参数模板化类?
Unpack a Variadic Templated Class when the constructor takes itself?
这是我上一篇文章的后续。我已经成功地设置和获取类的值。但是,现在我试图更进一步,让构造函数将自己作为参数。但是,我不确定如何正确解压缩它。
我试过:
#ifndef CONTROLLER_HPP
#define CONTROLLER_HPP
#include <functional>
#include <vector>
#include <iostream>
class Controller
{
public:
template <class...Classes>
Controller(Classes & ...classes)
{
toSet = [&](int val){(classes.updateValue(val), ...); };
toGet = [&](std::vector<int> &values)
{
int size[sizeof...(Classes)] = { (classes.get())...};
for(const auto &e: size) values.push_back(e);
};
}
// TODO: Find out how to create one master group if more than one are created.
//template <Controller&...Controllers, class...Classes>
template <class...Classes>
Controller(Controller& controllers(Classes&...classes)...) : Controller(classes&...c){};
void setValues(int val)
{
toSet(val);
}
std::vector<int> getValues()
{
std::vector<int> values;
toGet(values);
return values;
}
private:
std::function<void(int)> toSet;
std::function<void(std::vector<int>&)> toGet;
};
#endif
但是,在这种情况下,当我尝试将其传递给初始控制器构造函数时classes was not declared in this scope
我收到错误。我也尝试了注释掉的模板声明,但是 Id 认为这也不正确。我也尝试过Controller&...controllers(Classes&...)...) : (Controller(Classes&...classes));
,但这也不起作用。
我真的不知道接下来该尝试什么,或者我所要求的是否可以做到。或者,如果我模板化整个类,这可能更容易。我只是想避免Controller<A,B> controller(A,B);
,而只是创建Controller controller(A,B)
.但是,我理解我是否必须以另一种方式进行。
编辑:我应该澄清我正在尝试做什么:
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(const auto& e: getVales) std::cout << e << " ";
}
然后,这将设置所有类的所有值,并获取控制器中所有类的值。
在可以递归管理自身的类中转换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;
}
相关文章:
- 在不传递参数数量且只有3个点的情况下,如何使用变差函数
- 如何使用可变参数模板强制转换每个变体类型
- 关于如何在具有单个参数的变体构造中选择替代方案?
- 调用参数排列不变函数 f(i++, i++)
- 参数归纳与标准::变体
- 模板化回调参数的逆变,如 C# 中的逆变
- 如何在没有参数包的情况下编写变差函数
- 通过具有嵌套类的工厂类获取多个变异类模板参数包
- 获取模板参数的成员变量值列表
- 保留短 lambda 用作函数的中间参数,使用 clang 格式保持不变
- 如何定义变体<x,y,z>提取模板参数的子类型
- 正确对齐内存模板,参数顺序不变
- 递归中不同参数类型的变元模板函数
- 通过函数指针传递给变差函数的参数会更改其值
- 提升预定义为带有参数的全局 lambda 的变体访问者
- 使用可变参数模板参数提升变体访问者
- boost ::变体 - 为什么模板参数比const字符串参数具有更高的优先级
- 将变参数包中的值加载到临时数组中
- 使用额外参数提升变体访客
- 正在将动态数组元素解析为参数?(变音符)