在模板矢量&中使用pack参数Lambda - c ++

时间:2018-02-10 22:06:45

标签: c++ templates lambda variadic-templates

我正在尝试使用vector的lambda函数内的variadic模板包。 学习 c ++编程语言一书,它说"如果需要捕获一个可变参数模板参数,请使用..." (举一个简单的例子)。

我无法编译它,我的目的只是为了能够在lambda中打印可变参数类型:

#include <iostream>
#include <vector>
#include <typeinfo>

using namespace std;

template<typename... vectType>
void printAllElements(vector<vectType...>& nbList, ostream& output, int nbToTest){
  for_each(begin(nbList),end(nbList),
    [&vectType...](vectType... x){
      vectType... v;
      output << x << endl;
      output << typeid(v).name() << endl;
    }
  );
}

int main() {
  vector<int> myVect {10,20,156,236};
  printAllElements(myVect,cout, 4);
}

StackTrace:

learnC++/main.cpp:10:7: error: 'vectType' in capture list does not name a variable
    [&vectType...](vectType... x){
      ^
learnC++/main.cpp:11:15: error: only function and template parameters can be parameter packs
      vectType... v;
              ^
learnC++/main.cpp:12:7: error: variable 'output' cannot be implicitly captured in a lambda with no capture-default specified
      output << x << endl;

此致

更新1:

好的,所以我更新这个问题,添加两个Stroustrup的代码,我用他的建议加以说明。

Lambda&amp;向量

Void print_modulo(const vector<int>& v, ostream& os, int m){
  for_each(begin(b),end(v),
  [&os,m](int x){ if (x%m==0 os << w << '\n');}
}
  

使用lambda的版本是一个明显的赢家。但如果你真的想要一个   名字,你可以只提供一个..

  1. 捕获模板
  2.   

    如果需要捕获模板参数,请使用...例如:

    template<typename... Var>
    void algo(int s, Var... v){
      auto helper = [&s,&v...]{return s*(h1(v...)+h2(v...);)};
    }
    

    h1&amp; h2是简单的示例函数

1 个答案:

答案 0 :(得分:1)

我会尝试解释代码中的错误,但要真正理解,您需要阅读some good books

  • std::vector是一个同类容器,其所有元素只有一个相同的类型。这vector<vectType...>毫无意义。例如,std::vector<int>包含所有int元素;有没有这样的事情std::vector<int, double, short>。因此,如果您想为某些不同类型打印typeid,那么您的方法从一开始就是错误的。

  • 在您自己的代码[&vectType...]中,那些vectType类型,这也是毫无意义的。在引用的代码[&s,&v...]中,这些v变量,因此是正确的。

  • 此类vectType... v;声明是由您自己发明的,它不是C ++。

以下是C++14中的一个简单示例,如果您想打印变量&#39; typeid以通用方式:

#include <iostream>

template<class... Args>
void print_all_typeid(Args const &...args)
{
    auto dumb = [] (auto... x) {};
    auto printer = [] (auto const &x) {
        std::cout << typeid(x).name() << "\n";
        return true;
    };

    dumb(printer(args)...);
}

int main() {
    print_all_typeid(std::cin, 12, std::cout, 1L, 2.0, 3.f);
}