代码之家  ›  专栏  ›  技术社区  ›  MSalters

类模板推导指南的简单模板id中可以使用什么?

  •  0
  • MSalters  · 技术社区  · 3 年前

    Simple example 首先,不使用GCC12进行编译:

    #include <array>
    #include <iostream>
    #include <initializer_list>
    
    template <int nvars> class Test1 {
    
        public:
            Test1( std::initializer_list<int> IL ) : arr { 0 }
            {
                // See https://stackoverflow.com/questions/38932089/can-i-initialize-an-array-using-the-stdinitializer-list-instead-of-brace-enclo
            };
    
            const std::array<int,nvars> arr;
    };
    
    // CTAD guide                           / simple-template-id
    Test1(std::initializer_list<int> IL) -> Test1<IL.size()>;
    
    int main() {
        Test1 test1({1,2,3,4});
        std::cout << "nvars: " << test1.arr.size() << std::endl;
    }
    

    这个 simple-template_id 这是 Test1<IL.size()> 哪里 IL.size() 是一个 constexpr 函数返回4。它确实使用硬编码编译 4 ,但这显然违背了目的。

    中允许和不允许的内容 simple-template_id CTAD指南?哪些名称,哪些类型的表达式?

    1 回复  |  直到 3 年前
        1
  •  0
  •   user12002570    3 年前

    这个 问题 是这样的参数吗 IL 不是 constexpr 。这意味着我们不能使用 IL.size() 作为模板参数,因为模板参数需要是编译时常数。

    因此,为了解决这个问题,我们必须传递一个编译时常数作为模板参数。这样做的一种方法是将参数作为大小为的数组的引用 N 具有类型的元素 T 其中 T N 是模板参数。

    template<typename T, std::size_t N> Test1(T const(&&)[N]) -> Test1<N>;