• Пожаловаться

Михаил Гусаров: Вариации на тему STL. Адаптер обобщенного указателя на функцию-член класса

Здесь есть возможность читать онлайн «Михаил Гусаров: Вариации на тему STL. Адаптер обобщенного указателя на функцию-член класса» весь текст электронной книги совершенно бесплатно (целиком полную версию). В некоторых случаях присутствует краткое содержание. категория: Программирование / на русском языке. Описание произведения, (предисловие) а так же отзывы посетителей доступны на портале. Библиотека «Либ Кат» — LibCat.ru создана для любителей полистать хорошую книжку и предлагает широкий выбор жанров:

любовные романы фантастика и фэнтези приключения детективы и триллеры эротика документальные научные юмористические анекдоты о бизнесе проза детские сказки о религиии новинки православные старинные про компьютеры программирование на английском домоводство поэзия

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

libcat.ru: книга без обложки

Вариации на тему STL. Адаптер обобщенного указателя на функцию-член класса: краткое содержание, описание и аннотация

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

Михаил Гусаров: другие книги автора


Кто написал Вариации на тему STL. Адаптер обобщенного указателя на функцию-член класса? Узнайте фамилию, как зовут автора книги и список всех его произведений по сериям.

Вариации на тему STL. Адаптер обобщенного указателя на функцию-член класса — читать онлайн бесплатно полную книгу (весь текст) целиком

Ниже представлен текст книги, разбитый по страницам. Система сохранения места последней прочитанной страницы, позволяет с удобством читать онлайн бесплатно книгу «Вариации на тему STL. Адаптер обобщенного указателя на функцию-член класса», без необходимости каждый раз заново искать на чём Вы остановились. Поставьте закладку, и сможете в любой момент перейти на страницу, на которой закончили чтение.

Тёмная тема

Шрифт:

Сбросить

Интервал:

Закладка:

Сделать

template

struct gen_mem_fun_t {

explicit gen_mem_fun_t(R (T::*pm_)()): pm(pm_) {}

template R operator()(TT p) {return (p.operator->()->*pm)();}

private:

R (T::*pm)();

};

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

template<>

R operator()(T* p) {

return (p->*pm)();

}

Реализация gen_mem_fun

Теперь реализация gen_mem_fun становится тривиальной:

template

gen_mem_fun_t gen_mem_fun(R (T::*pm)()) {

return gen_mem_fun_t(pm);

}

Проблемы с разными компиляторами

Специализация шаблонных функций – членов шаблонного класса

К сожалению, вышеприведенный код не будет компилироваться на компиляторах, не поддерживающих специализацию шаблонов-функций – членов шаблонов классов.

ПРИМЕЧАНИЕК таким относятся, например, gcc-2.95 и gcc-2.96

Попробуем обойтись без них. Специализация в той или иной форме нам в любом случае понадобится, так что воспользуемся тем, что есть – частичной специализацией классов. Введем вспомогательный класс и специализируем его для особого случая обычных указателей.

template

struct gen_mem_fun_operator {

R operator()(TT p, R (T::*pm)()) {return (p.operator->()->*pm)();}

};

template

struct gen_mem_fun_operator {

R operator()(T* p, R (T::*pm)()) {return (p->*pm)();}

};

Тогда наш gen_mem_fun_t запишется так:

tem plate

struct gen_mem_fun_t {

explicit gen_mem_fun_t(R (T::*pm_)()): pm(pm_) {}

template R operator()(TT p) {return gen_mem_fun_operator()(p, pm);}

private:

R (T::*pm)();

};

Проблема “return void”

Посмотрим внимательнее на реализацию функции operator() в нашем адаптере. Что будет, если мы захотим в качестве типа возвращаемого значения функции использовать void? Наша функция запишется так: void operator() {return void;}. С точки зрения стандарта все хорошо, но все в нашем мире определяется стандартом: есть компиляторы, которые не воспринимают такую конструкцию как допустимую.

ПРИМЕЧАНИЕТаков, к примеру, Microsoft Visual C++ 6.0/7.0

К счастью, на помощь нам опять приходит частичная специализация:

template

struct gen_mem_fun_operator {

void operator()(TT p, void (T::*pm)()) {(p.operator->()->*pm)();}

};

template

struct gen_mem_fun_operator {

void operator()(T* p, void (T::*pm)()) {(p->*pm)();}

};

Частичная специализация

К сожалению, не все компиляторы поддерживают частичную специализацию шаблонных классов.

ПРИМЕЧАНИЕК таким относится и Microsoft Visual C++ 6.0/7.0

Для решения этой проблемы можно использовать паттерн «traits», специфичный для C++. К сожалению, он не сможет помочь в случае, когда один из параметров шаблона специализируется типом, зависящим от другого параметра шаблона, но в случае проблемы «return void» он помочь сможет.

ПРИМЕЧАНИЕВопрос, реально ли вообще симулировать частичную специализацию шаблонов, где специализируемый параметр шаблона зависит от неспециализируемого, на компиляторе, не поддерживающем частичную специализацию шаблонов и поддерживающем специализацию вообще только для глобальных классов и функций, остается открытым. Я такой возможности не вижу. Таким образом, создать без помощи препроцессора код нашего адаптера, компилирующийся и под gcc и под Visual C++, не представляется возможным.

Введем вспомогательный класс

template

struct gen_mem_fun_traits {

template

struct signature {

typedef gen_mem_fun_base_t base;

};

};

template<> struct gen_mem_fun_traits {

template struct signature {

typedef void_gen_mem_fun_base_t base;

};

};

Этот класс специализирован для специального случая функции, возвращающей void. Таким образом, хоть нам и придется ввести дополнительный класс для функций, возвращающих void, для клиента это будет выглядеть единообразно: gen_mem_fun_traits::signature::base.

Сами по себе ветви вычислений различных вариантов тривиальны:

template

struct gen_mem_fun_base_t {

protected:

gen_mem_fun_base_t(R (T::*pm_)()): pm(pm_) {}

public:

template R operator()(TT p) {return (p.operator->()->*pm)();}

template<> R operator()(T* p) {return (p->*pm)();}

private:

R (T::*pm)();

};

template

struct void_gen_mem_fun_base_t {

protected:

void_gen_mem_fun_base_t(void (T::*pm_)()): pm(pm_) {}

public:

template void operator()(TT p) {(p.operator->()->*pm)();}

Читать дальше
Тёмная тема

Шрифт:

Сбросить

Интервал:

Закладка:

Сделать

Похожие книги на «Вариации на тему STL. Адаптер обобщенного указателя на функцию-член класса»

Представляем Вашему вниманию похожие книги на «Вариации на тему STL. Адаптер обобщенного указателя на функцию-член класса» списком для выбора. Мы отобрали схожую по названию и смыслу литературу в надежде предоставить читателям больше вариантов отыскать новые, интересные, ещё не прочитанные произведения.


Отзывы о книге «Вариации на тему STL. Адаптер обобщенного указателя на функцию-член класса»

Обсуждение, отзывы о книге «Вариации на тему STL. Адаптер обобщенного указателя на функцию-член класса» и просто собственные мнения читателей. Оставьте ваши комментарии, напишите, что Вы думаете о произведении, его смысле или главных героях. Укажите что конкретно понравилось, а что нет, и почему Вы так считаете.