首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在类模板演绎指南的简单模板id中可以使用什么?

在类模板演绎指南的简单模板id中可以使用什么?
EN

Stack Overflow用户
提问于 2022-11-14 14:37:24
回答 1查看 40关注 0票数 0

首先,简单例子不使用GCC12编译:

代码语言:javascript
复制
#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_idTest1<IL.size()>,其中IL.size()是一个返回4的constexpr函数,它确实使用硬编码的4进行编译,但这显然不符合目的。

什么是和不允许在simple-template_id的CTAD指南?什么名字,什么类型的表达式?

EN

回答 1

Stack Overflow用户

发布于 2022-11-14 14:45:01

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

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

代码语言:javascript
复制
template<typename T, std::size_t N> Test1(T const(&&)[N]) -> Test1<N>;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74433344

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档