c_cpp 类似于元组的概念验证,但基于结构组合而不是结构继承。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c_cpp 类似于元组的概念验证,但基于结构组合而不是结构继承。相关的知识,希望对你有一定的参考价值。

#include <iostream>

template <typename IndexedStruct, int Index>
struct _getter {
    
    using Rest = decltype(std::declval<IndexedStruct>().rest);
    
    static auto& get(IndexedStruct &inst)
    {
        return _getter<decltype(inst.rest), Index-1>::get(inst.rest);
    }
    
    static int offsetof()
    {
        Rest &rest = static_cast<IndexedStruct*>(nullptr)->rest;
        
        int rest_offset = reinterpret_cast<const char *>(&rest) - static_cast<const char *>(nullptr);
        
        return rest_offset + _getter<Rest, Index-1>::offsetof();
    }
};

template <typename IndexedStruct>
struct _getter<IndexedStruct, 0> {

    static auto& get(IndexedStruct &inst) { return inst.first; }

    static int   offsetof() { return 0; }
};

template <typename ...Members>
struct indexed_struct {};

template <typename First, typename ...Rest>
struct indexed_struct<First, Rest...> {

    First first;
    indexed_struct<Rest...> rest;

    template <int Index> auto& get()
    {
        return _getter<decltype(*this), Index>::get(*this);
    }
    
    template <int Index> static int offsetof()
    {
        return _getter<indexed_struct, Index>::offsetof();
    }
};


int main()
{
   indexed_struct<int,int,float> my_data { 1, 2, 3.14159 };
   
   std::cout << my_data.get<0>() << " at offset " << decltype(my_data)::offsetof<0>() << std::endl;
   std::cout << my_data.get<1>() << " at offset " << decltype(my_data)::offsetof<1>() << std::endl;
   std::cout << my_data.get<2>() << " at offset " << decltype(my_data)::offsetof<2>() << std::endl;
}

以上是关于c_cpp 类似于元组的概念验证,但基于结构组合而不是结构继承。的主要内容,如果未能解决你的问题,请参考以下文章

pythopn tuple(元组)

组合数据类型,英文词频统计

老男孩Python学习之数据类型 元组

python 元组的概念以及 math 模块

基本数据类型____元组

基本数据类型____元组