
Dear colleagues, there is a version of sealed C++ class written with things described in article "http://www.cuj.com/documents/s=8943/cujexp0312wilson2/" by Matthew Wilson taken into account. Please review. Thank you in advance for you interest and time taken for review and discussion. Here is a template friends workaround for different compilers. Special thanks to Matthew Wilson. I decided to move it to the separated file because it can be reused many times. // // Copyright (c) 2006 Matthew Wilson <matthew@synesis.com.au> // Copyright (c) 2006 Vladislav Lazarenko <snail@b2bits.com> // // Distributed under 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) // #ifndef BOOST_TEMPLATE_FRIEND_HPP #define BOOST_TEMPLATE_FRIEND_HPP // MS compatible compilers support #pragma once. #if defined(_MSC_VER) && (_MSC_VER >= 1020) # pragma once #endif #if defined(__BORLANDC__) || \ defined(__COMO__) || \ defined(__DMC__) || \ (defined(__GNUC__) && __GNUC__ < 3) || \ defined(__INTEL_COMPILER) || \ defined(__WATCOMC__) || \ defined(_MSC_VER) # define BOOST_DECLARE_TEMPLATE_FRIEND(T) friend T #elif defined(__MWERKS__) # define BOOST_DECLARE_TEMPLATE_FRIEND(T) friend class T #elif defined(__GNUC__) && __GNUC__ >= 3 # define BOOST_DECLARE_TEMPLATE_FRIEND(T) \ namespace boost { namespace template_friend { \ struct friend_maker { \ typedef T T2; \ }; \ typedef typename friend_maker::T2 friend_type; \ friend friend_type; #endif #endif And here is sealed class template themselves. // // Copyright (c) 2006 Vladislav Lazarenko <snail@b2bits.com> // // Distributed under 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) // #ifndef BOOST_SEALED_HPP #define BOOST_SEALED_HPP // MS compatible compilers support #pragma once. #if defined(_MSC_VER) && (_MSC_VER >= 1020) # pragma once #endif #include <boost/template_friend.hpp> namespace boost { // protection from unintended ADL namespace sealed_ { template <typename T1, typename T2> class sealed_impl { BOOST_DECLARE_TEMPLATE_FRIEND(T1); BOOST_DECLARE_TEMPLATE_FRIEND(T2); private: /* NOTE TO USER: Compile error from here indicates that you has specified sealed class as the base class of another class. The sealed classes is used to prevent derivation from a class. An error occurs if a sealed class is specified as the base class of another class. A sealed class cannot also be an abstract class. */ sealed_impl() {} ~sealed_impl() {} }; } /*! The sealed classes is used to prevent derivation from a class. An error occurs if a sealed class is specified as the base class of another class. A sealed class cannot also be an abstract class. */ template <typename T> class sealed : virtual private sealed_::sealed_impl<sealed, T> { public: //! Constructor. sealed() {} //! Destructor. ~sealed() {} }; /* Usage example: class UniquePerson : public boost::sealed<UniquePerson> // It is impossible to inherit UniquePerson class. { public: UniquePerson() {} ~UniquePerson() {} }; */ } #endif