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.