Минимальный пример конструктора копирования, который делегирует выполнение конструктору шаблона, используя второй неиспользуемый (и по умолчанию) аргумент
#include <iostream>
template <typename T>
struct A
{
A()
{ }
A (A const & a0) : A{a0, 0}
{ }
template<typename U>
A (A<U> const &, int = 0)
{ std::cout << "template constructor" << std::endl; }
};
int main()
{
A<int> a0;
A<int> a1{a0};
}
- РЕДАКТИРОВАТЬ -
ОП просит
А как насчет operator=
? Попытка добавить фиктивный параметр приводит к ошибкам компилятора binary 'operator =' has too many parameters and 'operator =' cannot have default parameters
Для operator=()
Я предлагаю «делегировать» (не в смысле делегирования конструктора, в данном случае) оба оператора обычному методу; шаблон один.
Что-то как
template <typename U>
A & assign (A<U> const &)
{ /* do assignment */ return *this; }
A & operator= (A const & a0)
{ return assign(a0); }
template <typename U>
A & operator= (A<U> const & a0)
{ return assign(a0); }
Может быть, assign()
метод может быть private
.
Или лучше, как предлагает Jarod42 (спасибо), напрямую вызывая оператор шаблона из не-шаблона
template <typename U>
A & operator= (A<U> const & a0)
{ /* do assignment */ return *this; }
A & operator= (A const & a0)
{ return operator=<T>(a0); }