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

10-13 09:29