繁体   English   中英

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

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

我正在编写一个程序,它将充当类之间的控制器。 本质上,所有类都具有getter和setter,但是,这些getter和setter具有不同的名称,并且有些执行不同的操作。 例如, ClassA有一个setter setValue ,但ClassB有一个名为updateValue的setter。 这些类已经编写,并且我不想重写每个类以使用相同的名称,因为它们已经嵌入在代码库中。 取而代之的是,我在每个类中编写了一个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进行相同toGet ,我只能得到一个值。 因此,我对为什么这不起作用感到困惑。

Explatation

在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()...}; };

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM