C++17:在可变参数模板之前显式第一个模板参数

问题描述 投票:0回答:1

我正在尝试为任意维度的对称块矩阵编写一个通用类。仅给出上三角部分:

A B C
  D E
    F

因此块的数量为 n*(n+1)/2,其中 n 是维度(此处为 3)。
使用可变参数模板的可能实现是(为了简单起见,我使用整数作为块):

#include <tuple>
#include <cstddef>

template <size_t Dimension, typename... Blocks>
class SymmetricBlockMatrix {
public:
    constexpr SymmetricBlockMatrix(Blocks... blocks): blocks(blocks...) { }

    constexpr size_t dimension() const {
        return Dimension;
    }

protected:
    const std::tuple<Blocks...> blocks;
};

int main() {
    constexpr SymmetricBlockMatrix<3, int, int, int, int, int, int> m(1, 2, 3, 4, 5, 6);
    return 0;
}

我当然会检查块的数量是否与尺寸一致。

是否可以以某种方式仅显式提供维度并让编译器推断块的类型?然后我可以写:

int main() {
    constexpr SymmetricBlockMatrix<3> m(1, 2, 3, 4, 5, 6);
    return 0;
}

这会导致以下编译器错误:

error: no matching function for call to 'SymmetricBlockMatrix<3>::SymmetricBlockMatrix(int, int, int, int, int, int)'
   18 |     constexpr SymmetricBlockMatrix<3> m(1, 2, 3, 4, 5, 6);
c++ templates c++17 variadic
1个回答
0
投票

您可以使用旧的

make
辅助函数模板技巧,如下所示:

template <size_t V, typename... T>
constexpr SymmetricBlockMatrix<V, T...> make_SymmetricBlockMatrix(T... t)
{
    return SymmetricBlockMatrix<V, T...>{t...};
}
int main() {
    constexpr SymmetricBlockMatrix<3, int, int, int, int, int, int> k(1, 2, 3, 4, 5, 6);
    constexpr auto m = make_SymmetricBlockMatrix<3>(1, 2, 3, 4, 5, 6); //works now 
   
}

工作演示

© www.soinside.com 2019 - 2024. All rights reserved.