相关疑难解决方法(0)

这个元组创作成语有没有名字?

Boost邮件列表中,@ LouisDionne最近发布了以下创建类似元组的实体的巧妙技巧:

#include <iostream>

auto list = [](auto ...xs) { 
    return [=](auto access) { return access(xs...); }; 
}; 

auto length = [](auto xs) { 
    return xs([](auto ...z) { return sizeof...(z); }); 
};

int main()
{
    std::cout << length(list(1, '2', "3")); // 3    
}
Run Code Online (Sandbox Code Playgroud)

实例.

聪明之处在于listlambda采用可变参数列表作为输入,并返回lambda作为输出,将另一个lambda作用于其输入.类似地,lengthlambda是一个类似列表的实体,它将sizeof...向列表的原始输入参数提供可变参数运算符.在sizeof...操作上缠绕有拉姆达的内部,使得它可以被传递给list.

问题:这个元组创作成语是否有名称?也许来自函数式编程语言,其中更常用的是高阶函数.

c++ tuples variadic-templates generic-lambda c++14

62
推荐指数
2
解决办法
4954
查看次数

如何创建矢量矢量的笛卡尔积?

我有一个矢量说vector<vector<int> > items不同大小的矢量,如下所示

1,2,3
4,5
6,7,8
Run Code Online (Sandbox Code Playgroud)

我想根据这些向量的笛卡尔积来创建组合

1,4,6
1,4,7
1,4,8
and so on till
3,5,8
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点 ?我查了几个链接,我也在这篇文章的末尾列出了它们,但我无法解释它,因为我不熟悉这种语言.有些人可以帮助我.

#include <iostream>
#include <iomanip>
#include <vector>

using namespace std;

int main()
{
    vector<vector<int> > items;
    int k = 0;

    for ( int i = 0; i < 5; i++ ) {
        items.push_back ( vector<int>() );

        for ( int j = 0; j < 5; j++ )
            items[i].push_back ( k++ );
    }

    cartesian ( items ); // I want some function here …
Run Code Online (Sandbox Code Playgroud)

c++ combinations vector cartesian-product

20
推荐指数
3
解决办法
2万
查看次数

用基于范围的for循环替换多维for循环

我有一个Vec3课程.更换循环的最佳方法是什么?

for (int x = 20; x < 25; x++)
    for (int y = 40; y < 45; y++)
        for (int z = 2; z < 4; z++) doStuff({x,y,z});
Run Code Online (Sandbox Code Playgroud)

用这样的东西:

for(Vec3 v: Vec3range({20,40,2}, {25,45,4}))
    doStuff(v);
Run Code Online (Sandbox Code Playgroud)

没有任何运行时成本?

c++ for-loop c++11

6
推荐指数
1
解决办法
361
查看次数

用于循环模板参数/类型

我想为几个可能类的几种组合编写基准代码.如果我自己编写每个组合,它就变成了一个难以维护的混乱.因此,我正在寻找一种通过模板自动组合每种类型的方法,类似于以下伪代码:

for (typename HashFuction : Sha256, Sha512, Sa512_256, Sha3_256, Sha3_512) {
   for (typename KeyingWrapper : TwoPassKeyedHash, OnePassKeyedHash, PlainHash) {
      for (typename InstantiatedGetLeaf: GetLeaf<8>, GetLeaf<1024>) {
         for (typename algorithm : algA, algB, algC) {
            runAndTime<HashFunction,KeyingWrapper,
                       InstantiatedGetLeaf,algorithm>(someArgs);
         }
       }
    }
 }
Run Code Online (Sandbox Code Playgroud)

哪里Sha256,......,TwoPassKeyedHash......是类型.

我正在寻找的代码应该在功能上等同于以下内容:

runAndTime<Sha256,TwoPassKeyedHash,GetLeaf<8>,algA>(someArgs);
runAndTime<Sha256,TwoPassKeyedHash,GetLeaf<8>,algB>(someArgs);
runAndTime<Sha256,TwoPassKeyedHash,GetLeaf<8>,algC>(someArgs);

runAndTime<Sha256,TwoPassKeyedHash,GetLeaf<1024>,algA>(someArgs);
runAndTime<Sha256,TwoPassKeyedHash,GetLeaf<1024>,algB>(someArgs);
runAndTime<Sha256,TwoPassKeyedHash,GetLeaf<1024>,algC>(someArgs);

runAndTime<Sha256,OnePassKeyedHash,GetLeaf<8>,algA>(someArgs);
runAndTime<Sha256,OnePassKeyedHash,GetLeaf<8>,algB>(someArgs);
runAndTime<Sha256,OnePassKeyedHash,GetLeaf<8>,algC>(someArgs);

// And 99 further lines…
Run Code Online (Sandbox Code Playgroud)

在Peregring-lk的帮助下,我已经走到了尽头

#include <iostream>

template<typename Aux_type>
void test_helper()
{}

template<typename Aux_type, typename Head, typename... Tail>
void test_helper() {
   std::cout << Head::i;
   test_helper<Aux_type, …
Run Code Online (Sandbox Code Playgroud)

c++ templates metaprogramming

5
推荐指数
1
解决办法
1667
查看次数