+61.9
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
//Обьявление класса в хедере с последующей реализацией:
template<class TConstructStrategy>
class TClass
{
public:
TConstructStrategy __ctor;
//...Прочие методы...
};
//...Реализация прочих методов класса...
//================================================================
//Конструктор с переменным числом параметров, типа функтор:
//Тоесть обьявлено где-то в коде проекта и передаётся, как параметр при конструировании.
typedef void TConstract(int a);
template<>
TClass<TConstract>::TClass(int a)
{
//doing...
};
int main(int argc, char* argv[])
{
//...
TClass<TConstract> A(5);
//...
}
Это говнокод, но не результат работы над проектом, а результат насмешек над компилятором MSVC 6.0.
Основано на обявлении типа-функции:
typedef void TConstract(int a);, но тк конструктор не функция - используется внутренее имя конструктора MSVC6.0:
void __ctor(void);, согласно которому он всё-таки функция.
__dtor - "внутренее" имя деструктора, кстати.
Спалить "секретное" имя обычно можно в сообщениях об ошибках c участием этих имён. При входе в конструктор/деструктор через отладчик под дизасемблером(наверное). В стеке вызовов отладчика(наверное). Наверное ещё как-нибудь, например проходом HEX редактора по экзешнику компилятора и прилижащим dll...
Итак для обсуждения (хотя и не собираюсь это использовать):
1)Как ещё, кроме странных пергрузок, представленного выше метода конструктора-функтора, и вызовов типа A.__ctor(); / A.__dtor() это можно использовать?
2)Какие "скрытые" имена конструкторов/деструкторов у других компиляторов? Я пробовал в MSVC6.0. В MSVS 2008 при первом расмотрении "внутреннее" имя другое и сходу не палится.
Для примера приведу метод с "обычным" функтором (на самом деле он не самый обычный):
//Обьявление класса в хедере с последующей реализацией:
template<class TStrategy>
class TClass
{
public:
TStrategy func;
//...Прочие методы...
};
//...Реализация прочих методов класса...
//================================================================
//Функтор:
//Тоесть обьявлено где-то в коде проекта и передаётся, как параметр при конструировании.
typedef void TFunc(void);
template<>
void TClass<TFunc>::func(void)
{
//doing...
};
int main(int argc, char* argv[])
{
//...
TClass<TFunc> A;
A.func();
//...
};
fake_guest,
05 Февраля 2010