为什么我只从可变参数模板中提取一个值?

Why am I only extracting one value out of my variadic template?

本文关键字:提取 一个 变参 参数 为什么      更新时间:2023-10-16

我正在编写一个程序,它将充当类之间的控制器。从本质上讲,这些类都有 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()...}; };