Я борюсь со сложностью преобразований и приведения типов, и я не могу найти в Интернете совет, который четко гарантировал бы эффективное преобразование при возврате из функции. У меня есть два класса: Base и Derived, где Derived не имеет дополнительных элементов данных по сравнению с Base. У меня есть именованный конструктор для базового класса, который я хочу вернуть с помощью RVO и привести к объекту производного типа с минимальными накладными расходами.
class Base {
public:
static Base namedConstructor(int n){
return Base(n);
}
protected:
Base(int n) : member(n){
}
int member;
};
class Derived : public Base {
static Derived nC2(int n) {
Derived derived = namedConstructor(n);
// Error: no suitable user-defined conversion from "Base" to "Derived"...
// modify derived
return derived;
}
};
Есть ли способ исправить ошибку, который удовлетворяет всем следующим требованиям?
- Без использования RTTI. Динамическое литье кажется ненужным.
- Только одно определение namedConstructor на случай, если мне нужно его изменить. Если надо, могу сделать шаблон, но меня интересуют альтернативы.
- namedConstructor должен использовать RVO в nC2.
- Преобразование не должно автоматически завершаться ошибкой, если я добавляю или удаляю элементы данных либо из базового, либо из производного класса (это может сделать что-то похожее на reinterpret_cast).
Derived
даже не может быть сконструирован, так какBase
имеет частный конструктор. - person Manuel   schedule 26.07.2020