全部。我对C++相当陌生,并且正在用C++编写一个小型库(主要用于我自己的项目)。在设计类型层次结构的过程中,我遇到了定义赋值运算符的问题。编译时的C++类型检查
我所采取的最终在this article达到的基本方法,这是一个为每个类MyClass
在层次结构从类派生Base
定义就像两个赋值运算符这样:
class MyClass: public Base {
public:
MyClass& operator =(MyClass const& rhs);
virtual MyClass& operator =(Base const& rhs);
};
// automatically gets defined, so we make it call the virtual function below
MyClass& MyClass::operator =(MyClass const& rhs);
{
return (*this = static_cast<Base const&>(rhs));
}
MyClass& MyClass::operator =(Base const& rhs);
{
assert(typeid(rhs) == typeid(*this)); // assigning to different types is a logical error
MyClass const& casted_rhs = dynamic_cast<MyClass const&>(rhs);
try {
// allocate new variables
Base::operator =(rhs);
} catch(...) {
// delete the allocated variables
throw;
}
// assign to member variables
}
的一部分我关心的是类型平等的断言。由于我正在写一个图书馆,断言大概会被编出来的最终结果,这导致我去同一个方案,它看起来更像是这样的:
class MyClass: public Base {
public:
operator =(MyClass const& rhs); // etc
virtual inline MyClass& operator =(Base const& rhs)
{
assert(typeid(rhs) == typeid(*this));
return this->set(static_cast<Base const&>(rhs));
}
private:
MyClass& set(Base const& rhs); // same basic thing
};
但我一直在想,如果我可以在编译时检查类型。我看着Boost.TypeTraits,并且通过做BOOST_MPL_ASSERT((boost::is_same<BOOST_TYPEOF(*this), BOOST_TYPEOF(rhs)>));
来接近,但是由于rhs被声明为对父类而不是派生类的引用,所以它被阻塞了。
现在我想到了,我的推理看起来很愚蠢 - 我希望既然函数是内联的,它可以自己检查实际参数,但是当然预处理器总是在编译器之前运行。但是我想知道是否有人知道我可以在编译时执行这种检查。
没有办法在编译时检查类型,因为这是多态性的要点:事物的类型只在运行时确定。 '动物*动物=兰特()%2?新的狗():新的猫();' – UncleBens 2010-04-12 07:02:42
好文章链接的方式,谢谢:) – 2010-04-12 09:14:38