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 模块
基本数据类型____元组
基本数据类型____元组