Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проверка наличия метода с заданной сигнатурой, На этапе компиляции 
:(
    Опции темы
np9mi7
  Дата 10.11.2005, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 553
Регистрация: 17.8.2003
Где: Volgograd, Russia

Репутация: 5
Всего: 10



Добрый день!

Проблема: необходимо в зависимотси от наличия или отсутствия метода класса (сигнатура метода полностью известна) выбрать стратегию реализации функции, метода или класса;

Решение:

Приобрел себе всю серию книг C++ in Depth. При изучении книги "Решение сложных задач на С++" натолкнулся на решение схожей проблемы.

Необходимо было определить на этапе компиляции принадлежность объекта к семейству, проще говоря определить наследование одного класса от другого (на этапе компиляции). В качестве решения этой проблемы предлагается следующее:

Код

template <typename D, typename B> class IsDerivedFrom
{
        class No {};
        class Yes { No m_utNo [2];};
        
        static Yes Test (const B*);
        static No Test (...);
        
        static void Constraints (const D* pD)
        {
            B* pB = pD;
            pB = pD;
        }
        
    public:
        
        enum 
        {
            Is = (sizeof (Test (static_cast <D*> (0))) == sizeof (Yes));
        };
        
        IsDerivedFrom ()
        {
            void (*p) (const D*) = Constraints;
        }
};


Соответственно, при наличии или отсутствии наследования от того или иного интерфейса можно используя этот шаблон можно определять стратегию реализации того или иного метода, класса, функции:

Код

template <const bool t_bValue> void Some ();

template <> void Some <true> ()
{
    
}

template <> void Some <false> ()
{
    
}


Используя IsDerivedFrom это можно сделать так:

Код

void Some <IsDerivedFrom <Class1, Class2>::Is > ();


Интересно, а как определить не наследование от интерфейса, а наличие или отсутствие метода?

Заранее благодарен за ответы.


--------------------
"Я точно знаю то, что ничего не знаю..." Сократ.
evolution project
PM MAIL WWW ICQ MSN   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0360 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.