自定义实现tuple实战

自定义实现一个元组,可以保存不同类型的容器。

#pragma once
#include<string_view>

// 主模板的声明 template<typename... Args> class MyTuple;
// 当没有参数的时候,继承于一个空类,从而结束类的递归 template
<> class MyTuple<>{};
// 主要的实现细节 template
<typename T,typename... Args> class MyTuple<T,Args...> : private MyTuple<Args...>{                     // private继承可以有效的隐藏父类的实现 public: constexpr MyTuple(T val, Args... args) :MyTuple<Args...>(args...),value(val) {       // 构造函数通过不断地展开包,提取参数保存起来 } constexpr MyTuple<Args...> GetBase() const { return *this; } T value; }; // 对于字符串类型,我希望它是string_view类型,这样可以更方便的处理 template<typename T> using AsStringView = std::conditional_t<std::is_same_v<T, const char*>, std::string_view, T>; // 推导指引,通过C++17语法实现模板参数由构造函数的参数类型来推导 template<typename... Args> MyTuple(Args...) -> MyTuple<AsStringView<Args>...>;
// 实现一个方法,用来获取某一个序列的值 template
<size_t Index,typename... Args> consteval auto GetTupleValue(MyTuple<Args...> val) { if constexpr(Index == 1) { return val.value; } else { return GetTupleValue<Index - 1>(val.GetBase()); } }

1、元组主要通过类继承,不断的将参数包解包,将解开的参数保存在value中。

2、推导指引通过AsStringView方法筛选const char*类型,并转换为string_view类型。

constexpr构造函数在C++20中支持。

consteval在C++20中支持。

推导指引在C++17中支持。

if constexpr在C++17中支持。

MyTuple tp{ 12,"hello",2.34,"world!" };

  

posted @ 2024-03-14 20:31  饼干`  阅读(12)  评论(0编辑  收藏  举报