C++:lambda 中的参数包扩展失败

标签 c++ lambda c++14 variadic-templates

我正在尝试创建一种直接扩展多个参数包的方法。我创建了一个函数 template<size_t X,typename F> auto sequenceFunc(F&& f) , 调用给定函数 f扩展了 integer_sequence .

这适用于像这样的小函数:

template<typename T,
         size_t A,size_t B>
vec<B,T> col(const mat<A,B,T>& a,const size_t& i){
    return sequenceFunc<A>([&](auto... J) -> vec<B,T>{
        return { a[J][i]... }; //expands to a[0][i], a[1][i], ... a[A-1][i]
    });
}

不幸的是我不能扩展多个参数包,即使我遵循规则,一个参数包只能在一个...中。 -表达。 这是我尝试使用此函数进行矩阵乘法:

template<typename S,typename T,
         size_t A,size_t B,size_t C>
mat<C,B,S> mul(const mat<A,B,S>& a,const mat<C,A,T>& b){
    return sequenceFunc<B>([&](auto... I)->mat<C,B,S>{ //for all B rows in a...
        return {
            sequenceFunc<C>([&](auto... J)->vec<C,S>{ // ... look at all C columns in b and calculate dot product.
                auto i = I; //putting "I" outside the expansion of "J"
                return {
                    dot(row(a,i),col(b,J))... //expands J
                };
            })... //expands I
        };
    });
}

这是错误:

error: parameter packs not expanded with '...':
      auto i = I;
               ^

我真的不明白为什么需要扩展,因为还有一个 ...表达式之外。我使用 GCC 5.1.0。

信息 vecmat只有using -声明 std::array和一个嵌套的 std::array<std::array<A,T>,B>

最佳答案

这是 gcc bug 47226 .它仍然是打开的,代码示例在 gcc 5.2.0 上仍然失败,而在 clang 3.6 上编译得很好。你的代码在我看来是正确的。

关于C++:lambda 中的参数包扩展失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32358357/

相关文章:

c++ - 字符串初始值设定项和只读部分

c++ - 有没有一种方法可以在不捕获 lambda 变量的情况下编写更短的代码?

c++ - 为什么 std::cbegin 返回与 std::begin 相同的类型

c++ - const 关键字在函数声明中的位置

c++ - 如何将共享库添加到QtCreator

lambda - 下划线(_)在elisp中是什么意思?

私有(private)成员的 C++14 单元测试(解除)分配

c++ - lang支持__null吗?

c++ - C++ 中用于存储异构项的类或容器

ios - 如何通过 iOS SDK 调用 Lambda 函数?