以下是在构造函数中使用static_cast" safe"?
对于上下文,我正在尝试使用基于策略的设计的Win32窗口包装器。其中一部分涉及通过从保存消息映射到函数的基本调度程序继承来创建调度程序类,然后从各种消息破解程序派生,每个消息破解程序将向基类调度程序添加一个或多个处理程序。我想这样做而不需要任何进一步的管道,即每个消息类型在他们自己的构造函数中添加处理程序,而不是手动在调度程序的构造函数中执行它。
我认为我确保 Dispatcher_Base 在 Message_Type_1 和 Message_Type_2 之前构建是正确的,所以当他们的构造函数时如果被调用,static_cast将返回一个来自"这个"的有效对象。然而它闻起来很糟糕,所以我想知道我是否在基本前提中犯了一个大错误。
#include <iostream>
#include <vector>
template<typename dispatcher_type>
class Message_Type_1
{
public:
Message_Type_1()
{
auto * dispatcher = static_cast<dispatcher_type *>(this);
dispatcher->Add_Handler(1);
}
virtual ~Message_Type_1() = default;
};
template<typename dispatcher_type>
class Message_Type_2
{
public:
Message_Type_2()
{
auto * dispatcher = static_cast<dispatcher_type *>(this);
dispatcher->Add_Handler(2);
}
virtual ~Message_Type_2() = default;
};
class Dispatcher_Base
{
public:
Dispatcher_Base()
{
}
void Add_Handler(int x)
{
listeners.push_back(x);
}
std::vector<int> const & Get_Listeners() const
{
return listeners;
}
virtual ~Dispatcher_Base() = default;
private:
std::vector<int> listeners;
};
class Dispatcher_Derived : public Dispatcher_Base,
public Message_Type_1<Dispatcher_Derived>,
public Message_Type_2<Dispatcher_Derived>
{
public:
Dispatcher_Derived() = default;
virtual ~Dispatcher_Derived() = default;
};
int main(void)
{
Dispatcher_Derived dispatcher;
auto const & listeners = dispatcher.Get_Listeners();
std::cout << "There are " << listeners.size() << " listeners in the set." << std::endl;
for (auto i : listeners)
{
std::cout << i << std::endl;
}
return 0;
}