遵循“现代 C++ 设计”中的技术,我正在实现一个具有各种编译时优化的持久性库。如果该变量派生自给定类,我希望能够将函数分派给模板化成员变量:
template<class T, template <class> class Manager = DefaultManager> class Data
{
private:
T *data_;
public:
void Dispatch()
{
if(SUPERSUBCLASS(Container, T))
{
data_->IKnowThisIsHere();
}
else
{
Manager<T>::SomeGenericFunction(data_);
}
}
}
其中 SUPERSUBCLASS 是用于确定对象继承的编译时宏。当然,在 T 确实从 Container 继承(或 T 是内在类型等)的所有情况下,这都会失败,因为编译器正确地抱怨 IKnowThisIsHere() 不是数据成员,即使永远不会遵循此代码路径,使用 T = int 进行预处理后,如下所示:
private:
int *data_;
public:
void Dispatch()
{
if(false)
{
data_->IKnowThisIsHere();
编译器清楚地抱怨这段代码,即使它永远不会被执行。使用 dynamic_cast 的建议也不起作用,因为在编译时再次尝试了不可能的类型转换(例如使用 T=double,std::string):
void Dispatch()
{
if(false)
{
dynamic_cast<Container*>(data_)->IKnowThisIsHere();
error: cannot dynamic_cast '((const Data<double, DefaultManager>*)this)->Data<double, DefaultManager>::data_' (of type 'double* const') to type 'class Container*' (source is not a pointer to class)
error: cannot dynamic_cast '((const Data<std::string, DefaultManager>*)this)->Da<sttad::string, DefaultManager>::data_' (of type 'struct std::string* const') to type 'class Container*' (source type is not polymorphic)
如果 T 确实从 Container 继承,我真的需要模拟(或确实说服!)让编译器发出一组代码,如果不是,则发出另一组代码。
有什么建议么?