Информация об изменениях

Сообщение Re[3]: Простая задачка обощённого программирования от 17.10.2019 15:08

Изменено 17.10.2019 15:13 rg45

Re[3]: Простая задачка обощённого программирования
Здравствуйте, Kernan, Вы писали:

R>>Добавляешь в placeholder объявление чисто виртуальной функции вывода в поток и реализуешь ее в каждом наследнике impl<T>, если нужно, предоставляешь специализации. В операторе дергаешь виртуальную функцию.

K>Всё же impl<T> он побольше чем я наисал. В принципе, это первое что я и сделал в первом приближении, но мне не хочется писать 3-4 спецификации impl. Хочется как-то извратиться чтобы иметь возможность надстраивать повеение impl своим типозависимым принтером. который пишется в одну строчку под кокретный тип или работает шаблонная, т.е. дефолтовая версия.

Во-первых, большой шаблонный класс обычно легко расклыдвается на стратегии — как раз с той целью, чтоб можно было специализировать маленькие стратегии, а не весь класс. Во-вторых, существует такой вид специализации — специализация нешаблонной функции члена шаблонного класса. Подчиняется тем же правилам, что и специализация обычной шаблонно функции (Т.е. специализация возможно только полная).
Re[3]: Простая задачка обощённого программирования
Здравствуйте, Kernan, Вы писали:

R>>Добавляешь в placeholder объявление чисто виртуальной функции вывода в поток и реализуешь ее в каждом наследнике impl<T>, если нужно, предоставляешь специализации. В операторе дергаешь виртуальную функцию.

K>Всё же impl<T> он побольше чем я наисал. В принципе, это первое что я и сделал в первом приближении, но мне не хочется писать 3-4 спецификации impl. Хочется как-то извратиться чтобы иметь возможность надстраивать повеение impl своим типозависимым принтером. который пишется в одну строчку под кокретный тип или работает шаблонная, т.е. дефолтовая версия.

Во-первых, большой шаблонный класс обычно легко расклыдвается на стратегии — как раз с той целью, чтоб можно было специализировать маленькие стратегии, а не весь класс. Во-вторых, существует такой вид специализации — специализация нешаблонной функции члена шаблонного класса. Подчиняется тем же правилам, что и специализация обычной шаблонно функции (Т.е. специализация возможно только полная).

Эскизно так:

class placehoder
{
public:
    virtual void do_output(std::ostream&) = 0;
};

template <typename> struct OutputHelper;

template <typename T>
class impl : public placeholder
{
    void do_output(std::ostream& output) override
    {
        OutputHelper<T>(output, value);
    }
};


И теперь специализируй OutputHelper, сколько душе угодно.