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.