gpt4 book ai didi

c++ - 标签中的继承反射

转载 作者:太空狗 更新时间:2023-10-29 22:56:59 25 4
gpt4 key购买 nike

我正在研究一种发布者/订阅者 block 。订阅者将通过标签订阅消息。系统中的消息按层次结构组织,因此我希望标签反射(reflect)层次结构。我做了一小段代码,我想看看系统怎么样

class TMsg {};

class TMsg1: public TMsg {};

class TMsg2: public TMsg {};

template<class T>
struct tag {};

template<>
struct tag<TMsg1>: public tag<TMsg> {};

template<>
struct tag<TMsg2>: public tag<TMsg> {};


template<class T>
void processMessage(T &t) {
tag<T> ti;
procMsgImpl(ti);
}

void procMsgImpl(tag<TMsg>&) {
std::cout << "f" << std::endl;
}

void procMsgImpl(tag<TMsg1>&) {
std::cout << "f1" << std::endl;
}


int main() {
TMsg t;
TMsg1 t1;
TMsg2 t2;

processMessage(t);
processMessage(t1);
processMessage(t2);
return 0;
}

我想在代码片段中避免的是显式定义标签的继承 struct tag<TMsg1>: public tag<TMsg> {}; ,如果 TMsg 是 TMsg1 的基类,我希望标签隐式保留此信息。

最佳答案

这样的事情对你有用吗?这个想法是让您的 TMsg 类继承自包装器并具有通用标签:

#include <iostream>

// use this as a wrapper
template <class B>
struct base
: public B {

using base_type = B;
};

class TMsg {};

// inherit from the wrapper
class TMsg1: public base<TMsg> {};

// inherit from the wrapper
class TMsg2: public base<TMsg> {};

// generic tag
template<class T>
struct tag
: public tag<typename T::base_type>{};

// full specialization for the base class
template <>
struct tag<TMsg> {};

template<class T>
void processMessage(T &t) {
tag<T> ti;
procMsgImpl(ti);
}

void procMsgImpl(tag<TMsg>&) {
std::cout << "f" << std::endl;
}

void procMsgImpl(tag<TMsg1>&) {
std::cout << "f1" << std::endl;
}


int main() {
TMsg t;
TMsg1 t1;
TMsg2 t2;

processMessage(t);
processMessage(t1);
processMessage(t2);
return 0;
}

关于c++ - 标签中的继承反射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46173855/

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