Я пишу набор параметризованных классов C ++, и мне интересно, что некоторые из них ведут себя аналогично указателям. В частности, я хочу иметь возможность создавать объект с постоянным параметром шаблона из объекта с непостоянным параметром шаблона, но не наоборот. Этот пример кода должен прояснить мои намерения:
int main() {
myClass<int> mc_int;
myClass<const int> mc_const_int;
myClass<const int> mc1(mc_const_int); // This should compile.
myClass<int> mc2(mc_int); // This should compile.
myClass<const int> mc3(mc_int); // This should compile.
myClass<int> mc4(mc_const_int); // This should NOT compile.
}
Мне удалось добиться этого конкретного поведения, создав следующую иерархию классов (упрощенную для удобства чтения):
template <typename T>
class Base {
// ...
protected:
template <typename U>
Base(const Base<U> &obj): _elem(obj._elem) {}
private:
T _elem;
friend class Base<const T>;
};
template <typename T>
class myClass: public Base<T> {
// ...
public:
template <typename U>
myClass(const myClass<U> &obj): Base<const U>(obj) {}
};
И это работает, как и ожидалось, но я не совсем удовлетворен этим дизайном, потому что я могу обнаружить только непостоянный параметр шаблона из конструктора, но не из любой другой функции-члена.
Если бы я хотел, например, создать контейнерный класс с методом addAll()
, я бы хотел сделать это:
int main() {
Container<int> c_int;
c_int.add(new int(1));
c_int.add(new int(2));
c_int.add(new int(3));
Container<const int> c_const_int;
c_const_int.addAll(c_int); // This should compile.
c_int.addAll(c_const_int); // This should NOT compile.
}
Но я не знаю, как добиться предыдущего поведения. У кого-нибудь есть идеи альтернативного дизайна для достижения того, что я пытаюсь сделать? Кто-нибудь знает ссылку, где эта проблема обсуждается более подробно?
Заранее спасибо.