首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++大小模板演绎

C++大小模板演绎
EN

Stack Overflow用户
提问于 2022-08-30 06:44:03
回答 1查看 64关注 0票数 0

我想用带有一些扩展功能的std::array创建一个包装器。类应该可以通过std::initializer_list进行实例化。我还需要一个构造函数,可以将类的现有实例加上一个“后缀”传递给它,这意味着实例需要大小为+ 1。

代码语言:javascript
复制
#include <stddef.h>
#include <array>
#include <initializer_list>

template<size_t L>
class JsonPointer {
public:
   constexpr JsonPointer(std::array<const char*, L> segments)
        : m_path_segments(std::move(segments))
    {
    }

    constexpr JsonPointer(std::initializer_list<const char*> list) : m_path_segments(std::array<const char*, list.size()>)
    {
    }

    template<size_t S>
    JsonPointer(JsonPointer<S> existing, const char* suffix)  {
    }

private:
    std::array<const char*, L> m_path_segments;
};

int main(){
    constexpr JsonPointer base_ptr {"a", "n"};
    auto ptr = JsonPointer(base_ptr, "test");
}

如何使用std::initializer_list的大小进行星座初始化?在“扩展”中,如何使演绎实现S=L+1

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-08-30 07:00:12

使用C++20,您可以通过添加2 用户定义的演绎指南来实现这一点。

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

template<size_t S>
JsonPointer(JsonPointer<S> existing, const char* suffix)->JsonPointer<S + 1>;

它们允许编译器在不命名完整模板的情况下找到正确的演绎。

代码语言:javascript
复制
template<size_t L>
class JsonPointer {
public:
    constexpr JsonPointer(std::array<const char*, L> segments)
        : m_path_segments(std::move(segments))
    {
    }

    constexpr JsonPointer(std::initializer_list<const char*> list) : m_path_segments() {
        std::copy(list.begin(), list.end(), this->m_path_segments.begin());
    }

    template<size_t S>
    constexpr JsonPointer(JsonPointer<S> existing, const char* suffix) : m_path_segments() {
        std::copy(existing.m_path_segments.begin(), existing.m_path_segments.end(), 
            this->m_path_segments.begin());
        this->m_path_segments.back() = std::move(suffix);
    }

    template<size_t S>
    friend class JsonPointer;
private:
    std::array<const char*, L> m_path_segments;
};

template<typename... Ts>
JsonPointer(Ts... ts)->JsonPointer<sizeof...(Ts)>;

template<size_t S>
JsonPointer(JsonPointer<S> existing, const char* suffix)->JsonPointer<S + 1>;

int main() {
    constexpr JsonPointer base_ptr{ "a", "n" };
    constexpr auto ptr = JsonPointer(base_ptr, "test");
}

constexpr ptr现在持有{"a", "n", "test"}

试试看

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73538190

复制
相关文章

相似问题

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