/ / Ako môžem odstrániť duplikáciu kódu spôsobenú členom odboru a jeho implicitne vymazanými funkciami člena? - c ++

Ako môžem odstrániť duplicitu kódu spôsobenú členom odborovej skupiny a jej implicitne odstránenými členskými funkciami? - c ++

Mám triedu šablón C<T> ktoré by mali byť okamžité C<U> kedy T môže byť konštruovaný U, Ako ukazuje nasledujúci kód, mám nejaký duplicitný kód; môžem odložiť volanie na šablónu kópie?

template <typename T>
class C
{
public:
C() {}
~C() {}

template <typename U>
C( C<U> const& other ) { /* ... duplicate code ... */ }

// required, since union automatically declares this overload as deleted
C( C const& other ) { /* ... duplicate code ... */ }

private:
union
{
T t;
};
};

Moje súčasné riešenie je nasledovné:

struct ctor_tag_t {};

template <typename T>
class C
{
public:
C() {}
~C() {}

template <typename U>
C( C<U> const& other, ctor_tag_t = ctor_tag_t{} ) { /* ... code ... */ }

C( C const& other ) : C( other, ctor_tag_t{} ) {}

private:
union
{
T t;
};
};

Existuje lepší spôsob? Má táto značka odoslať akýkoľvek zásah? I "d skôr duplicitné kód, ak je to tak.

odpovede:

0 pre odpoveď č. 1

"M od počítača, aby som to nemohol" otestovať v tomto momente, ale pravdepodobne by ste mohli vynútiť rozlíšenie pomocou nejakého intersticiálneho typu, a nie pomocou dummy parametrov:

template <typename T>
struct dummy
{
T const& t;

dummy (T const& t): t(t) {}
operator T const&() { return t; }
};

template <typename T>
class C
{
public:
template <typename U>
C (U const& other);

C (C const& other): C (dummy<C>{other}) {}
};

Neviem, ako by to mohlo byť naklonené alebo čo by to malo byť, a je to na diskusiu, či to skutočne predstavuje zvýšenie čitateľnosti oproti parametru vašej značky.