为什么我只从可变参数模板中提取一个值?
Why am I only extracting one value out of my variadic template?
我正在编写一个程序,它将充当类之间的控制器。从本质上讲,这些类都有 getter 和 setter,但是,getter 和 setter 有不同的名称,有些执行不同的操作。例如ClassA
有一个二传手setValue
,但ClassB
有一个名为updateValue
的二传手。这些类已经编写好了,我不想重写每个类以具有相同的名称,因为它们已经嵌入在代码库中。相反,我在每个类中编写了一个updateVariable
函数,该函数将调用它各自的 setter。
现在我已经完成了这个解释,我将展示控制器类:
#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 = [&](){ return (classes.get(), ...); };
}
void setValues(int val)
{
toSet(val);
}
std::vector<int> getValues()
{
std::vector<int> values;
values.emplace_back(toGet());
return values;
}
private:
std::function<void(int)> toSet;
std::function<int()> toGet;
};
#endif
我仍然不确定toSet
是如何工作的,例如,如果我在 main 中声明它:
int main()
{
ClassA a;
ClassB b;
ClassC c;
Controller control(A,B,C);
control.setValues(20);
}
这会将所有类的值设置为 20。但我不知道魔法是如何运作的,因为它似乎只被称为一次。但是,当我用toGet
尝试同样的事情时,我只得到一个值。所以我对为什么这不起作用感到困惑。
解释
在C++中,在语句之间放置逗号会丢弃除最后一个语句之外的所有内容的返回值:
int x = (10, 20, "Hello", 30);
// x is 30
逗号运算符在两个地方使用。在这里,toSet
toSet = [&](int val){(classes.updateValue(val), ...); };
在这里,toGet
:
toGet = [&](){ return (classes.get(), ...); };
toSet
工作正常,因为您不关心updateValue
的返回值。您要做的就是更新值。但是,toGet
只返回传入的最后一个值。
修复
如果get()
总是为所有类返回相同的类型(例如,int),我们可以修改toGet
以返回一个向量:
// Declaration:
// std::function<std::vector<int>()> toGet;
toGet = [&]() { return std::vector<int>{classes.get()...}; };
相关文章:
- 如何设置一个范围来提取我想要获得的信息
- C++(.cpp文件和.h文件)拆分代码并添加一个函数,提取 - 这很容易吗?
- 如何创建一个函数来提取向量内部字符串中的字段?
- 是否可以将多个结构作为一个数据包存储在一个函数中,然后传递给其他函数并在那里提取?
- 当字符串中只有一个"GOOD"字符串可用时,从没有空格的字符串中提取第一个单词的最佳和有效方法?
- C/C :提取一个枚举的子集以形成新的枚举
- 制作一个对的向量,对其进行排序,然后从中提取向量
- 为什么我只从可变参数模板中提取一个值?
- C++ HDF5 提取复合数据类型的一个成员
- 从给定的STL容器中提取带有给定谓词的元素到另一个容器
- 每隔一行或每一列提取一个特征矩阵作为一个新矩阵
- 当使用字符串流解析字符串时,它会提取一个换行符
- 如何正确从uint16_t变量中提取一个特定位
- 使用QRegularExpression从句子中提取一个十进制数
- 使用QRegularExpression提取一个完整的句子
- 如何从一行中提取一个字符并将其放入常量字符*中
- 使用c++和sqlite从call_history.db中提取一个表
- 提取一个QMenu的宽度?奇怪的问题
- 从字符串中提取一个数字
- 从一个向量中提取一个特定的数字序列