Здравствуйте, Nickolas, Вы писали:
N>Всем привет. Есть вот такой код:
N>N>#include <iostream>
N>#include <vector>
N>struct basic_stream
N>{
N> virtual std::ostream& operator << (int v) {}
N>};
N>struct super_stream : basic_stream
N>{
N> template<typename T>
N> std::ostream& operator << (T const &v)
N> {
N> std::cout << "operator << (T const &v)" << std::endl;
N> }
N> virtual std::ostream& operator << (int v)
N> {
N> std::cout << "operator << (int v)" << std::endl;
N> }
N> template<typename T>
N> std::ostream& operator << (std::vector<T> const &v)
N> {
N> std::cout << "operator << (std::vector<T> const &v)" << std::endl;
N> }
N>};
N>struct another_super_stream : basic_stream {};
N>int main()
N>{
N> super_stream ss;
N> basic_stream& bs = ss;
N> std::vector<int> v;
N> bs << v;
N>}
N>
N>В краце хочеться, чтобы каждый стрим мог форматировать данные как ему хочеться. Но в момент, когда начинается форматирование у меня есть только ссылка на базовый стрим.
N>Понятно, что приведенный код работать не будет: в базом классе нет нужного operator <<.
N>Добавить его в базовый класс и сделат виртуальным тоже не получиться, так как он параметризован.
N>Есть ли возможность это как-то обойти? Или может есть стандартные приемы для подобных случаев?
Ну насколько я понимаю, через интерфейс базового класса можно вызвать только методы в нём (интерфейсе) определённые. Если хочется вызывать методы наследников, то приводи тип, используя dynamyc_cast.