специализация шаблона для класса и потомков

alexy_black
Дата: 24.03.2015 10:49:40
хочу перегрузить оператор << чтобы для всего он просто записывал во внутренний поток, а для потомков определенного класса делал кое-что другое

вот например

#include <iostream>
#include <type_traits>

template<bool B, class T = void>
struct enable_if_not {};
template<class T>
struct enable_if_not<false, T> { typedef T type; };

class base {};
class child:public base{};
class stream {};

template<class T>
stream& operator << (stream& out, const typename enable_if_not<std::is_base_of<base,T>::value,T>::type& o) {
    std::cout << "some other: " << o << std::endl;
    return out;
}
stream& operator << (stream& out, const base& obj) {
    std::cout << "object was " << std::endl;
    return out;
}

int main() {
    stream out;
    base bo;
    child co;
    out << "hello" << 111ul << bo << std::string("co") << co;
}

я разные вариации такого подхода пробовал, пробовал внутренний оператор сделать, специализации, без const. никак. что не верно?
alexy_black
Дата: 24.03.2015 11:04:03
о, парни, вроде работает :)
stream& operator << (stream& out, const base& obj) {
    std::cout << "object was " << std::endl;
    return out;
}
template<class T>
typename enable_if_not<std::is_base_of<base,T>::value,stream>::type& operator << (stream& out, const T& o) {
    std::cout << "some other: " << o << std::endl;
    return out;
}


то же работает и при встроенных операторах
блин! ночью страдал. утро вечера.. так сказать..

а может кто знает, как это же сделать, только что бы не городить свой тип, enable_if_not?
mayton
Дата: 24.03.2015 15:40:05
alexy_black, букв дохренища. Вроде задача простая. Распечатать или сериализовать объект... Не?
alexy_black
Дата: 24.03.2015 22:06:38
а как проще? :)
если убрать enable_if_not то ничего работать не будет. только если приобразовывать к базовому классу кога пихаешь в поток.

это составной боъект и он должен, да, распечатываться :) но также должен хранить указатели на другие объекты своего типа и также их распечатывать.

+
ни в жизнь не догадаетесь для чего :P
Anatoly Moskovsky
Дата: 24.03.2015 22:12:34
alexy_black
ни в жизнь не догадаетесь для чего :P

AST?
alexy_black
Дата: 24.03.2015 22:31:12
это виджеты, они должны генерить html
определенный класс виджетов может другие содержать. если у него есть виджеты, которые он содержит, то ему нужно ими управлять, удалять например, передавать какие-то данные и т.д.
удобно было бы в него запихивать оператором << для потока, потому что для него определено много преобразований. то есть я могу одинм оператором все обрабатывать, удобно.
locked
Дата: 25.03.2015 10:49:37
alexy_black
это виджеты, они должны генерить html
определенный класс виджетов может другие содержать. если у него есть виджеты, которые он содержит, то ему нужно ими управлять, удалять например, передавать какие-то данные и т.д.
удобно было бы в него запихивать оператором << для потока, потому что для него определено много преобразований. то есть я могу одинм оператором все обрабатывать, удобно.

Если это система виджетов то сериализация через одно место параметрический полиморфизм выглядит как пятая нога.
mayton
Дата: 25.03.2015 15:41:02
"Средство" оказалось более желанно чем "цель"...
alexy_black
Дата: 25.03.2015 23:43:36
locked
Если это система виджетов то сериализация через одно место параметрический полиморфизм выглядит как пятая нога.


эм.. а чем?
например, я могу сделать так

some_place << "вот первый виджет: " << some_widget << "&lt; br / &gt;";
for(int i=0;i<wcontainer.size();i++)
     some_place << "вот виджет номер " << i << ": " << wcontainer[i] << "&lt; br / &gt;";


блин, не знаю как поставить скобку, знаки с & не выводятся правильно, а если скобку поставить, получается тег :)
some_place - это какое-то определенное место на странице, которое представлено виджетом.
то есть я могу выводить данные в html и вставлять виджеты как мне надо. чем не подход? или как лучше если это не гуд?
alexy_black
Дата: 25.03.2015 23:50:00
хотя так можно подумать что легче сразу в поток записывать :)
просто виджеты несут некую нагрузку. я могу таким образом менять текст в нужном месте, могу подключать события (сделал специальный механизм для этог) могу указывать зависимости (чтобы когда какой-нибудь виджет включаешь нужные файлы добавлялись в head или загрузались на клиенте через websocket)
клиенту отдается не содержимое потока, а строка, где в нужных местах вставлены виджеты