这是代码,c ++ 11:
#include <string>
#include <boost/signals2/signal.hpp>
namespace messages {
struct Event1 final {};
struct Event2 final {};
template <typename T, typename Tag>
class EventHandler {
protected:
bool cache_valid_ = false;
T cache_val_;
boost::signals2::signal<void (const T&)> signal_;
using slot_type = typename decltype(signal_)::slot_type;
using connection = boost::signals2::connection;
public:
EventHandler() {}
void emit(Tag, const T& val) {
if (val != cache_val_) {
cache_valid_ = true;
cache_val_ = val;
signal_(val);
}
}
connection subscribe(Tag, slot_type slot) {
if (cache_valid_)
slot(cache_val_);
return signal_.connect(slot);
}
};
}
struct MessageBus : public messages::EventHandler<int, messages::Event1>,
public messages::EventHandler<std::string, messages::Event2> {
};
int main()
{
MessageBus bus;
bus.subscribe(messages::Event1(), [](const int& val) {});
}
最新版本的gcc和clang无法使用-std=c++11
编译此代码,他们无法决定在此处选择哪种重载:bus.subscribe(messages::Event1(), [](const int& val) {});
。
MessageBus::subscribe
,它接受Event1
类型作为第一个参数
2)如何修复此问题,而不进行MessageBus
修改?
我可以通过以下代码修复此问题:
struct MessageBus : public messages::EventHandler<int, messages::Event1>,
public messages::EventHandler<std::string, messages::Event2> {
using messages::EventHandler<int, messages::Event1>::subscribe;
using messages::EventHandler<std::string, messages::Event2>::subscribe;
};
但messages::EventHandler
背后的整个想法是为了减少引入新邮件的工作,因此最好通过某种方式修改messages::EventHandler
来解决此问题。