gpt4 book ai didi

c++ - 我可以使用模板提取结构或公共(public)类成员吗?

转载 作者:太空狗 更新时间:2023-10-29 20:48:54 26 4
gpt4 key购买 nike

基本上,我有很多像这样的不同类型的结构:

typedef struct
{
char memberA;
int memberB;
...
} tStructA;

是否可以使用模板从结构中获取/提取任意成员?在伪代码中,我正在寻找类似这样的东西:

/*This is pseudocode!*/
template <typename STRUCT_TYPE, typename MEMBER_TYPE, membername NAME>
class cMemberExtractor
{
public:
MEMBER_TYPE
extract(const STRUCT_TYPE* pStruct) const
{
return pStruct->NAME;
}
};

背后的想法是像这样使用模板:

/*somewhere*/
void
producer()
{
//produce update
tStructA* pUpdate=new tStructA;
...
//send update to receivers
emit(pUpdate);
}


/*elsewhere*/
void
consumer(const tStructA* pUpdate)
{
//extract data
int data=cMemberExtractor<tStructA,int,memberB>().extract(pUpdate);
//process data
...
}

感谢您的帮助!

最佳答案

您可以不使用名称而是使用成员指针来做到这一点:

template <typename C, typename M>
struct updater_t {
typedef M C::*member_ptr_t;

updater_t( member_ptr_t ptr, M const & new_value )
: new_value( new_value ), ptr(ptr)
{}
updater_t( member_ptr_t ptr, C & original )
: new_value( original.*ptr ), ptr(ptr)
{}
void operator()( C & obj ) {
obj.*ptr = new_value;
}
M new_value;
member_ptr_t ptr;
};
struct test {
int value;
};
int main() {
updater_t<test,int> update( &test::value, 10 );
test object;
update( object );

test object2;
updater_t<test,int> update_copy( &test::value, object );
update_copy( object2 );
}

编辑:按照 litb 的建议将成员指针移动到模板参数:

template <typename C, typename M, M C::* Ptr>
struct updater_t {
updater_t( M const & new_value ) : new_value( new_value ) {}
updater_t( member_ptr_t ptr, C & original ) : new_value( original.*Ptr ) {}
void operator()( C & obj ) {
obj.*ptr = new_value;
}
M new_value;
};
int main() {
updater_t<test,int, &test::value> update( 10 );
test object;
update( object );
}

关于c++ - 我可以使用模板提取结构或公共(public)类成员吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2332690/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com