我正在研究一种发布者/订阅者块。订阅者将按标签订阅消息。系统中的消息按层次结构进行组织,因此我希望标记反射(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/