test_smart_cast.cpp

来自「Boost provides free peer-reviewed portab」· C++ 代码 · 共 228 行

CPP
228
字号
/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8// test_smart_cast.cpp: // (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . // Use, modification and distribution is subject to the Boost Software// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at// http://www.boost.org/LICENSE_1_0.txt)// <gennadiy.rozental@tfn.com>#include <exception>#include <boost/serialization/smart_cast.hpp>#include "test_tools.hpp"#include <boost/noncopyable.hpp>using namespace boost::serialization;class Base1 : public boost::noncopyable{    char a;};class Base2{    int b;};class Derived : public Base1, public Base2{    long c;};BOOST_BROKEN_COMPILER_TYPE_TRAITS_SPECIALIZATION(Base1)BOOST_BROKEN_COMPILER_TYPE_TRAITS_SPECIALIZATION(Base2)BOOST_BROKEN_COMPILER_TYPE_TRAITS_SPECIALIZATION(Derived)// if compiler doesn't support TPS, the smart_cast syntax doesn't// work for references.  One has to use the smart_cast_reference// syntax (tested below ) instead.void test_static_reference_cast_2(){    Derived d;    Base1 & b1 = static_cast<Base1 &>(d);    Base2 & b2 = static_cast<Base2 &>(d);    Base1 & scb1 = smart_cast<Base1 &, Derived &>(d);    Base2 & scb2 = smart_cast<Base2 &, Derived &>(d);    BOOST_CHECK_EQUAL(& b1, & scb1);    BOOST_CHECK_EQUAL(& b2, & scb2);    // downcast//    BOOST_CHECK_EQUAL(& d, & (smart_cast<Derived &, Base1 &>(b1)));//    BOOST_CHECK_EQUAL(& d, & (smart_cast<Derived &, Base2 &>(b2)));    // crosscast pointers fails at compiler time    // BOOST_CHECK_EQUAL(pB2,smart_cast<B2 *>(pB1));    // though explicit cross cast will always work    BOOST_CHECK_EQUAL(& b2,(        & smart_cast<Base2 &, Derived &>(            smart_cast<Derived &, Base1 &>(b1)        ))    );}void test_static_reference_cast_1(){    Derived d;    Base1 & b1 = static_cast<Base1 &>(d);    Base2 & b2 = static_cast<Base2 &>(d);    Base1 & scb1 = smart_cast_reference<Base1 &>(d);    Base2 & scb2 = smart_cast_reference<Base2 &>(d);    BOOST_CHECK_EQUAL(& b1, & scb1);    BOOST_CHECK_EQUAL(& b2, & scb2);    // downcast    BOOST_CHECK_EQUAL(& d, & (smart_cast_reference<Derived &>(b1)));    BOOST_CHECK_EQUAL(& d, & (smart_cast_reference<Derived &>(b2)));    // crosscast pointers fails at compiler time    // BOOST_CHECK_EQUAL(pB2,smart_cast<B2 *>(pB1));    // though explicit cross cast will always work    BOOST_CHECK_EQUAL(& b2,(        & smart_cast_reference<Base2 &>(            smart_cast_reference<Derived &>(b1)        ))    );}void test_static_pointer_cast(){    // pointers    Derived d;    Derived *pD = & d;    Base1 *pB1 = pD;    Base2 *pB2 = pD;    // upcast    BOOST_CHECK_EQUAL(pB1, smart_cast<Base1 *>(pD));    BOOST_CHECK_EQUAL(pB2, smart_cast<Base2 *>(pD));    // downcast    BOOST_CHECK_EQUAL(pD, smart_cast<Derived *>(pB1));    BOOST_CHECK_EQUAL(pD, smart_cast<Derived *>(pB2));    // crosscast pointers fails at compiler time    // BOOST_CHECK_EQUAL(pB2, smart_cast<Base2 *>(pB1));    // though explicit cross cast will always work    BOOST_CHECK_EQUAL(pB2,        smart_cast<Base2 *>(            smart_cast<Derived *>(pB1)        )    );}class VBase1 : public boost::noncopyable{    char a;public:    virtual ~VBase1(){};};class VBase2{    int b;public:    virtual ~VBase2(){};};class VDerived : public VBase1, public VBase2{    long c;public:    virtual ~VDerived(){};};BOOST_BROKEN_COMPILER_TYPE_TRAITS_SPECIALIZATION(VBase1)BOOST_BROKEN_COMPILER_TYPE_TRAITS_SPECIALIZATION(VBase2)BOOST_BROKEN_COMPILER_TYPE_TRAITS_SPECIALIZATION(VDerived)// see abovevoid test_dynamic_reference_cast_2(){    VDerived d;    VBase1 &b1 = dynamic_cast<VBase1 &>(d);    VBase2 &b2 = static_cast<VBase2 &>(d);    VBase1 & vb1 = smart_cast<VBase1 &, VDerived &>(d);    BOOST_CHECK_EQUAL(& b1, & vb1);    BOOST_CHECK_EQUAL(& b2, (& smart_cast<VBase2 &, VDerived &>(d)));    // downcast    BOOST_CHECK_EQUAL(& d, (& smart_cast<VDerived &, VBase1 &>(b1)));    BOOST_CHECK_EQUAL(& d, (& smart_cast<VDerived &, VBase2 &>(b2)));    // crosscast     BOOST_CHECK_EQUAL(& b2, (& smart_cast<VBase2 &, VBase1 &>(b1)));    // explicit cross cast should always work    BOOST_CHECK_EQUAL(& b2, (        & smart_cast<VBase2 &, VDerived &>(            smart_cast<VDerived &, VBase1 &>(b1)        ))    );}void test_dynamic_reference_cast_1(){    VDerived d;    VBase1 &b1 = dynamic_cast<VBase1 &>(d);    VBase2 &b2 = static_cast<VBase2 &>(d);    VBase1 & vb1 = smart_cast_reference<VBase1 &>(d);    BOOST_CHECK_EQUAL(& b1, & vb1);    BOOST_CHECK_EQUAL(& b2, (& smart_cast_reference<VBase2 &>(d)));    // downcast    BOOST_CHECK_EQUAL(& d, (& smart_cast_reference<VDerived &>(b1)));    BOOST_CHECK_EQUAL(& d, (& smart_cast_reference<VDerived &>(b2)));    // crosscast     BOOST_CHECK_EQUAL(& b2, (& smart_cast_reference<VBase2 &>(b1)));    // explicit cross cast should always work    BOOST_CHECK_EQUAL(& b2, (        & smart_cast_reference<VBase2 &>(            smart_cast_reference<VDerived &>(b1)        ))    );}void test_dynamic_pointer_cast(){    // pointers    VDerived d;    VDerived *pD = & d;    VBase1 *pB1 = pD;    VBase2 *pB2 = pD;    // upcast    BOOST_CHECK_EQUAL(pB1, smart_cast<VBase1 *>(pD));    BOOST_CHECK_EQUAL(pB2, smart_cast<VBase2 *>(pD));    // downcast    BOOST_CHECK_EQUAL(pD, smart_cast<VDerived *>(pB1));    BOOST_CHECK_EQUAL(pD, smart_cast<VDerived *>(pB2));    // crosscast pointers fails at compiler time    BOOST_CHECK_EQUAL(pB2, smart_cast<VBase2 *>(pB1));    // though explicit cross cast will always work    BOOST_CHECK_EQUAL(pB2,        smart_cast<VBase2 *>(            smart_cast<VDerived *>(pB1)        )    );}inttest_main(int /* argc */, char * /* argv */[]){    test_static_reference_cast_2();    test_static_reference_cast_1();    test_static_pointer_cast();    test_dynamic_reference_cast_2();    test_dynamic_reference_cast_1();    test_dynamic_pointer_cast();    return EXIT_SUCCESS;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?