c++ 使用tuple存储内容

 代码抄自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++里,如何把模版函数放入数组中?

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容