我想用带有一些扩展功能的std::array创建一个包装器。类应该可以通过std::initializer_list进行实例化。我还需要一个构造函数,可以将类的现有实例加上一个“后缀”传递给它,这意味着实例需要大小为+ 1。
#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
发布于 2022-08-30 07:00:12
使用C++20,您可以通过添加2 用户定义的演绎指南来实现这一点。
template<typename... Ts>
JsonPointer(Ts... ts)->JsonPointer<sizeof...(Ts)>;
template<size_t S>
JsonPointer(JsonPointer<S> existing, const char* suffix)->JsonPointer<S + 1>;它们允许编译器在不命名完整模板的情况下找到正确的演绎。
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"}
https://stackoverflow.com/questions/73538190
复制相似问题