gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:38:54 27 4
gpt4 key购买 nike

我正在编写一个程序,它将充当类之间的 Controller 。本质上,这些类都有 getter 和 setter,但是,getter 和 setter 具有不同的名称,有些执行不同的操作。例如,ClassA 有一个 setter setValue,但是 ClassB 有一个名为 updateValue 的 setter。这些类已经编写好了,我不想重写每个类以具有相同的名称,因为它们已经嵌入到代码库中。相反,我在每个类中编写了一个 updateVariable 函数,它将调用它各自的 setter。

现在我已经解释完了,我将展示 Controller 类:

#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 以返回一个 vector :

// Declaration: 
// std::function<std::vector<int>()> toGet;
toGet = [&]() { return std::vector<int>{classes.get()...}; };

关于c++ - 为什么我只从可变参数模板中提取一个值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55911389/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com