18:27

Йа волосат и бородат!
Интересно бы написать конструкцию, которая смогла бы определить, обьявлен ли в указанном классе метод.

Что-нить вроде такого, например:
static void foo();

struct method_exists {
void foo();
};

struct method_not_exists {
void foo();
};

template <typename T>
void call_foo(T * ptr);


Где call_foo в зависимости от существования в определении класса T метода foo вызвала бы этот метод, либо глобальную реализацию static void foo.

Вот такой я извращенец, дооааааа :)

Комментарии
25.09.2009 в 14:11

это круто.
тока можно поподробнее про
template void call_foo(T * ptr);
что напишешь внутри?

еще проблема - как будет работать, если foo() будет private?

у меня тока 1 мысль есть:
static void foo();
struct method_exists {
void foo();
void callfoo(){ foo();};
};
struct method_not_exists {
void not_foo();
void callfoo(){ foo();};
};

method_exists.callfoo();
method_not_exists.callfoo();

З.Ы. в дельфи как-то понадобилось определять, является ли метод абстрактным. Можно было бы и без этого, но тогда бы сильно усложнилась бы диаграмма классов...
25.09.2009 в 15:06

Йа волосат и бородат!
CTM, про template void call_foo(T * ptr); подробнее не могу - в ней-то и состоит задача. :)
Если foo() будет private - то, скорее всего либо будет ошибка (типа не могу достучаться бла-бла-бла) или просто посчитает, что нет метода. Это уже зависит от механизма работы с шаблонами.

Вообще, мысль у меня такая - это можно попробовать реализовать, используя алгоритм построения конструкций из шаблона и принципа SFINAE (Substitution failure is not an error), благодрая которому можно делать всякие селекторы на шаблонах (Классификация типа шаблонного аргумента - указатель/указатель на функцию/на метод/ссылка/массив и т.д.) Пока не придумал, как.
25.09.2009 в 16:29

как извратно-то. может проще быть? наследнвание и виртуальные методы? в общем-то оно идеально подходит...
26.09.2009 в 01:49

Йа волосат и бородат!
Идеально, да не совсем и не везде.
1) Это засоряет ненужными вызовами и работой режим выполнения, что для некоторых задач может оказаться критичным.
2) Представь, что ты пишешь логописца. Да, можно сделать просто, но хочется в некоторых случаях проследить динамику изменения данных внутри, что дебаггером сделать не всегда возможно - особенно если это многопотоковое приложение и изменение данных зависит от работы других потоков. Засорение процессами разруливания виртуальных вызовов может повлиять, если итерации обработок малы - тут лучше пользоваться явными вызовами, которые надо задавать либо жестко, либо вешать на этап компиляции.

Тут можно возразить насчет длительности операций записи на диск - но можно тупо писать в буфер в памяти, периодически сливая это все на винт, что организует хотя бы небольшие промежутки более-менее "чистой" работы процессов.

ЗЫ: Идея вообще вылезла как раз из задачи написания логгера :)
01.10.2009 в 12:17

опять хочешь все и сразу %)
01.10.2009 в 14:46

Йа волосат и бородат!
Конечно. Иначе не получится красиво. Правда так может вообще ничего не получиться.

Расширенная форма

Редактировать

Подписаться на новые комментарии