/ / Jak mogę usunąć duplikację kodu spowodowaną przez członka związku i jego niejawnie usunięte funkcje członka? - c ++

Jak mogę usunąć duplikację kodu spowodowaną przez członka związku i jego niejawnie usunięte funkcje członka? - c ++

Mam klasę szablonu C<T> to powinno być natychmiastowe C<U> gdy T może być skonstruowany z U. Jak pokazuje poniższy kod, mam zduplikowany kod; czy mogę odroczyć połączenie z kopią szablonu?

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 obecne rozwiązanie jest następujące:

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;
};
};

Czy jest lepszy sposób? Czy wysyłanie tagów powoduje jakiekolwiek uderzenie wydajności? Ja raczej powielam kod, jeśli tak jest.

Odpowiedzi:

0 dla odpowiedzi № 1

„Jestem daleko od komputera, więc nie mogę przetestować tego w tej chwili, ale prawdopodobnie możesz wymusić rozdzielczość, używając jakiegoś typu pełnoekranowego, a nie fikcyjnych parametrów:

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}) {}
};

Nie ma pojęcia, jak dobrze można by to ująć lub jaki byłby narzut, i trzeba się zastanowić, czy w rzeczywistości oznacza to wzrost czytelności w stosunku do parametru znacznika.