首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在没有大小的情况下存储字符串文本数组.简单模板大于数组大小

在没有大小的情况下存储字符串文本数组.简单模板大于数组大小
EN

Stack Overflow用户
提问于 2022-06-13 11:47:30
回答 2查看 71关注 0票数 -1

我正在探索在没有侧码大小信息的情况下存储文字数组(任何类型)的方法。我已经草拟了一些方法,但每个方法都有一些挥之不去的问题。这是最简单的方法,模板大于数组大小。请注意,这是一个简单的测试用例,实际的类可能有额外的成员、额外的模板参数和必须提供的模板参数。

代码语言:javascript
复制
template <size_t I>
struct A0 {
    std::array<const char*, I> a;
};

问题是,大小与字符串文本分离,这使得这类错误变得太容易:

代码语言:javascript
复制
// error, not caught
auto a0 = A0<3>{{"1","2"}};

虽然下面的初始化是有效的,因为C++20不允许部分CTAD,但是如果必须指定任何模板参数,它就不能工作。此外,它还将样板转换为样板:'<3>‘,以换取'std::array’。如果不指定类型,CTAD将无法推断模板大小参数'I‘。

代码语言:javascript
复制
auto a0 = A0{std::array{"1","2"}};

是否有一个扣减指南允许:

代码语言:javascript
复制
auto a0 = A0{{"1","2"}};
EN

回答 2

Stack Overflow用户

发布于 2022-06-13 11:57:23

所以,您是在询问auto a0 = A0{{"1","2"}};,但是这里首先是auto a0 = A0{"1","2"};的演绎指南。

代码语言:javascript
复制
template<typename... Ts>
A0(Ts...) -> A0<sizeof...(Ts)>;

我认为它的作用是明确的。它只是计算给定的参数数。

对于auto a0 = A0{{"1","2"}};

代码语言:javascript
复制
template<typename T, std::size_t N>
A0(const T(&)[N]) -> A0<N>;

这依赖于这样一个事实,即可以通过模板参数推断将带括号的参数推导为数组类型。这里的警告是,带括号的参数的所有元素都必须具有相同的类型。

如果要同时使用这两种演绎指南,则应将第二条中的T约束为不为const char,以确保特例A0{"123"}不被视为数组案例。根据要在此窗体中允许的隐式转换,您可能无论如何希望约束这些类型。

然后,在类模板参数推导之后,这两种方法都依赖于聚合初始化(可以省略额外的大括号)来实际构造类实例。但是,如果类中有构造函数,它也会同样工作。

票数 0
EN

Stack Overflow用户

发布于 2022-06-13 12:02:34

如果用户指定了不正确的参数数,则可以创建一个模板构造函数,该构造函数与用户定义的演绎指导线组合在一起,既可以推断正确的参数计数,也可以导致编译器错误:

代码语言:javascript
复制
template <size_t I>
struct A0 {
    template<class ...Args>
    constexpr A0(Args...args)
        : a{ args... }
    {
        static_assert(sizeof...(args) == I, "parameter count does not match array size");
    }

    std::array<const char*, I> a;
};

template<class ...Args>
A0(Args...) -> A0<sizeof...(Args)>;

constexpr A0 a{ "1", "2", "3" };
static_assert(std::is_same_v<std::remove_const_t<decltype(a)>, A0<3>>, "expectation mismatch");

constexpr A0<4> a1 { "1", "2", "3" }; // compiler error: parameter count does not match array size
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72602293

复制
相关文章

相似问题

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