代码之家  ›  专栏  ›  技术社区  ›  Charlie Vanaret

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

  •  2
  • Charlie Vanaret  · 技术社区  · 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);
    
    1 回复  |  直到 1 年前
        1
  •  1
  •   user12002570    1 年前

    一种解决方法是使用旧的 make 辅助函数模板技巧以及 auto 如下图所示:

    //this is a helper
    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 
       
    }
    

    Working demo