美文网首页
c++ 使用tuple存储内容

c++ 使用tuple存储内容

作者: help_youself | 来源:发表于2022-11-09 21:33 被阅读0次

 代码抄自pybind11.

#include <iostream>
#include <type_traits>
#include <tuple>
/// Helper template to strip away type modifiers
template <typename T>
struct intrinsic_type {
    using type = T;
};
template <typename T>
struct intrinsic_type<const T> {
    using type = typename intrinsic_type<T>::type;
};
template <typename T>
struct intrinsic_type<T *> {
    using type = typename intrinsic_type<T>::type;
};
template <typename T>
struct intrinsic_type<T &> {
    using type = typename intrinsic_type<T>::type;
};
template <typename T>
struct intrinsic_type<T &&> {
    using type = typename intrinsic_type<T>::type;
};
template <typename T, size_t N>
struct intrinsic_type<const T[N]> {
    using type = typename intrinsic_type<T>::type;
};
template <typename T, size_t N>
struct intrinsic_type<T[N]> {
    using type = typename intrinsic_type<T>::type;
};
template <typename T>
using intrinsic_t = typename intrinsic_type<T>::type;
template <typename T>
class type_caster{
public:
    bool load(){
        return true;
    }
};
template <typename type>
using make_caster = type_caster<intrinsic_t<type>>;


template <size_t...>
struct index_sequence {};
template <size_t N, size_t... S>
struct make_index_sequence_impl : make_index_sequence_impl<N - 1, N - 1, S...> {};
template <size_t... S>
struct make_index_sequence_impl<0, S...> {
    using type = index_sequence<S...>;
};
template <size_t N>
using make_index_sequence = typename make_index_sequence_impl<N>::type;

template <typename ...Args>
class argument_loader{
public:
    using indices = make_index_sequence<sizeof...(Args)>;
    void print(){
        print_info(indices{});
    }
private:
    template <size_t... Is>
    void print_info(index_sequence<Is...>){
        std::cout<<sizeof...(Is)<<std::endl;
        int i=0;
        for(bool r:{std::get<Is>(args).load()...}){
            std::cout<<r<<" "<<i<<std::endl;
            i++;
        }
    }
    std::tuple<make_caster<Args>...> args;
};

int main() {
    argument_loader<int,float,double> me;
    me.print();
    return 0;
}

 解释两个模板的用法,第一处

std::tuple<make_caster<Args>...> args;

按照main中传入的参数,这句代码会被编译器处理为:

std::tuple<make_caster<int>,make_caster<float>,make_caster<double>> args;

 第二处:

  for(bool r:{std::get<Is>(args).load()...})

编译器处理后,{}中内容是由函数返回值组成的序列。
[1]c++里,如何把模版函数放入数组中?

相关文章

网友评论

      本文标题:c++ 使用tuple存储内容

      本文链接:https://www.haomeiwen.com/subject/namatdtx.html