#include <iostream>
#include <type_traits>
namespace so
{
struct _base_ { } ;
struct _foo1_{ } ;
struct _foo2_{ } ;
struct _foo3_{ } ;
class _derived_: public _base_
{
public :
_derived_( ) = default ;
_derived_( _derived_ const & _obj)
: _base_( _obj)
{
std:: cout << "Constructed from _derived_" << std:: endl ;
}
_derived_( _base_ const & _obj)
: _base_( _obj)
{
std:: cout << "Constructed from _base_" << std:: endl ;
}
template < typename _t_, typename = typename std:: enable_if <
std:: is_same < _t_, _foo1_> :: value || std:: is_same < _t_, _foo2_> :: value ||
std:: is_same < _t_, _foo3_> :: value > :: type >
_derived_( _t_ const & )
: _base_( )
{
std:: cout << "Constructed from _fooN_ using generic algorithm" << std:: endl ;
}
~_derived_( ) noexcept ( true ) = default ;
} ;
} //namespace so
int main( )
{
so:: _base_ b_{ } ;
so:: _derived_ d_{ } ;
so:: _foo1_ f1_{ } ;
so:: _foo2_ f2_{ } ;
so:: _foo3_ f3_{ } ;
so:: _derived_ db_{ b_} ;
so:: _derived_ dd_{ d_} ;
so:: _derived_ df1_{ f1_} ;
so:: _derived_ df2_{ f2_} ;
so:: _derived_ df3_{ f3_} ;
return ( 0 ) ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZV90cmFpdHM+CgpuYW1lc3BhY2Ugc28KewpzdHJ1Y3QgX2Jhc2VfIHt9OwoKc3RydWN0IF9mb28xX3t9OwpzdHJ1Y3QgX2ZvbzJfe307CnN0cnVjdCBfZm9vM197fTsKCmNsYXNzIF9kZXJpdmVkXzogcHVibGljIF9iYXNlXwp7CiBwdWJsaWM6CiAgX2Rlcml2ZWRfKCkgPSBkZWZhdWx0OwoKICBfZGVyaXZlZF8oX2Rlcml2ZWRfIGNvbnN0ICYgX29iaikKICAgICAgOiBfYmFzZV8oX29iaikKICB7CiAgIHN0ZDo6Y291dCA8PCAiQ29uc3RydWN0ZWQgZnJvbSBfZGVyaXZlZF8iIDw8IHN0ZDo6ZW5kbDsKICB9CgogIF9kZXJpdmVkXyhfYmFzZV8gY29uc3QgJiBfb2JqKQogICAgICA6IF9iYXNlXyhfb2JqKQogIHsKICAgc3RkOjpjb3V0IDw8ICJDb25zdHJ1Y3RlZCBmcm9tIF9iYXNlXyIgPDwgc3RkOjplbmRsOwogIH0KCiAgdGVtcGxhdGUgPHR5cGVuYW1lIF90XywgdHlwZW5hbWUgPSB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwKICAgICBzdGQ6OmlzX3NhbWU8X3RfLCBfZm9vMV8+Ojp2YWx1ZSB8fCBzdGQ6OmlzX3NhbWU8X3RfLCBfZm9vMl8+Ojp2YWx1ZSB8fCAKICAgICBzdGQ6OmlzX3NhbWU8X3RfLCBfZm9vM18+Ojp2YWx1ZT46OnR5cGU+CiAgX2Rlcml2ZWRfKF90XyBjb25zdCAmKQogICAgICA6IF9iYXNlXygpCiAgewogICBzdGQ6OmNvdXQgPDwgIkNvbnN0cnVjdGVkIGZyb20gX2Zvb05fIHVzaW5nIGdlbmVyaWMgYWxnb3JpdGhtIiA8PCBzdGQ6OmVuZGw7CiAgfQoKICB+X2Rlcml2ZWRfKCkgbm9leGNlcHQgKHRydWUpID0gZGVmYXVsdDsKfTsKfSAvL25hbWVzcGFjZSBzbwoKCmludCBtYWluKCkKewogc286Ol9iYXNlXyBiX3t9Owogc286Ol9kZXJpdmVkXyBkX3t9Owogc286Ol9mb28xXyBmMV97fTsKIHNvOjpfZm9vMl8gZjJfe307CiBzbzo6X2ZvbzNfIGYzX3t9OwoKIHNvOjpfZGVyaXZlZF8gZGJfe2JffTsKIHNvOjpfZGVyaXZlZF8gZGRfe2RffTsKIHNvOjpfZGVyaXZlZF8gZGYxX3tmMV99Owogc286Ol9kZXJpdmVkXyBkZjJfe2YyX307CiBzbzo6X2Rlcml2ZWRfIGRmM197ZjNffTsKCiByZXR1cm4gKDApOwp9