Йа волосат и бородат!
Интересно бы написать конструкцию, которая смогла бы определить, обьявлен ли в указанном классе метод.
Что-нить вроде такого, например:
Где call_foo в зависимости от существования в определении класса T метода foo вызвала бы этот метод, либо глобальную реализацию static void foo.
Вот такой я извращенец, дооааааа
Что-нить вроде такого, например:
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.
Вот такой я извращенец, дооааааа

тока можно поподробнее про
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();
З.Ы. в дельфи как-то понадобилось определять, является ли метод абстрактным. Можно было бы и без этого, но тогда бы сильно усложнилась бы диаграмма классов...
Если foo() будет private - то, скорее всего либо будет ошибка (типа не могу достучаться бла-бла-бла) или просто посчитает, что нет метода. Это уже зависит от механизма работы с шаблонами.
Вообще, мысль у меня такая - это можно попробовать реализовать, используя алгоритм построения конструкций из шаблона и принципа SFINAE (Substitution failure is not an error), благодрая которому можно делать всякие селекторы на шаблонах (Классификация типа шаблонного аргумента - указатель/указатель на функцию/на метод/ссылка/массив и т.д.) Пока не придумал, как.
1) Это засоряет ненужными вызовами и работой режим выполнения, что для некоторых задач может оказаться критичным.
2) Представь, что ты пишешь логописца. Да, можно сделать просто, но хочется в некоторых случаях проследить динамику изменения данных внутри, что дебаггером сделать не всегда возможно - особенно если это многопотоковое приложение и изменение данных зависит от работы других потоков. Засорение процессами разруливания виртуальных вызовов может повлиять, если итерации обработок малы - тут лучше пользоваться явными вызовами, которые надо задавать либо жестко, либо вешать на этап компиляции.
Тут можно возразить насчет длительности операций записи на диск - но можно тупо писать в буфер в памяти, периодически сливая это все на винт, что организует хотя бы небольшие промежутки более-менее "чистой" работы процессов.
ЗЫ: Идея вообще вылезла как раз из задачи написания логгера