Каков правильный способ перенаправления всех родительских конструкторов в С++ 0x?
Я делал это:
class X: public Super {
template<typename... Args>
X(Args&&... args): Super(args...) {}
};
Каков правильный способ перенаправления всех родительских конструкторов в С++ 0x?
Я делал это:
class X: public Super {
template<typename... Args>
X(Args&&... args): Super(args...) {}
};
В С++ 0x есть лучший способ для этого
class X: public Super {
using Super::Super;
};
Если вы объявляете шаблон идеальной пересылки, ваш тип будет плохо работать при разрешении перегрузки. Представьте, что ваш базовый класс конвертируется из int
и существуют две функции для печати классов
class Base {
public:
Base(int n);
};
class Specific: public Base {
public:
template<typename... Args>
Specific(Args&&... args);
};
void printOut(Specific const& b);
void printOut(std::string const& s);
Вы вызываете его с помощью
printOut("hello");
Что будет называться? Это неоднозначно, потому что Specific
может преобразовывать любые аргументы, включая массивы символов. Он делает это без учета существующих конструкторов базового класса. Наследование конструкторов с использованием объявлений объявляет только конструкторы, необходимые для выполнения этой работы.
Думаю, вам нужно сделать Super(std::forward<Args>(args)...)
, если вы хотите, чтобы все было правильно отправлено. args
имеет имя, поэтому я считаю, что он связывается с регулярными ссылками до ссылок rvalue.
Более того, вы не будете пересылать конструкторы копий таким образом. Компилятор все равно будет генерировать один для вас, потому что он не рассматривает конструкторы шаблонов. В приведенном примере вы в порядке, потому что созданный компилятор просто вызовет конструктор родительских копий, так или иначе, что именно вы хотите. Если это не подходит в более сложном случае, тогда вам придется написать его самостоятельно.