+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
fake_guest 05.02.2010 22:41 # 0
"Обычный" функтор TClass<TFunc> A; компилируется во многих компиляторах, более или менее соответсвующих стандарту.
Продолжаем обсуждение, но уже относительно "обычного" функтора(приведенный чуть выше код), тк всерьёз задумываюсь над его использованием :
3)Это говнокод и использовать его не стоит?
4)Какие ещё интересные применения можно найти для типов-функций typedef void TFunc(void);?
guest 05.02.2010 23:31 # 0
fake_guest 05.02.2010 23:58 # 0
fake_guest 06.02.2010 01:23 # 0
Обнаружил ошибочку функтора (в конструкторе она тоже есть). Хотя исправляется легко.
В выше приведённом коде не удаётся обьявить второй функтор с тем же числом параметров в том же CPP-файле. Пишет, что мол уже обьявлен. Исправляеться легко:
Единственное, для различных компиляторов нужно правильно расставить ключевое слово typename. Например, для MSVC6.0 оно вообще не нужно.
GovnocoderJr 06.02.2010 14:03 # +6
guest 06.02.2010 18:43 # −2
guest 06.02.2010 20:03 # +5
guest 06.02.2010 20:08 # −1
guest 06.02.2010 22:25 # 0
Barmaglot 06.02.2010 23:40 # 0
Barmaglot 06.02.2010 23:44 # 0
guest 06.02.2010 20:11 # 0
Barmaglot 06.02.2010 23:37 # 0
Жаль, но такой код не переносим. Почитал стандарт, и вот что там сказано про шаблоны:
14.3.1/3:
If a declaration acquires a function type through a type dependent on a template-parameter and this causes a declaration that does not use the syntactic form of a function declarator to have function type, the program is ill-formed. [Example:
template<class T> struct A {
static T t;
};
typedef int function();
A<function> a; // ill-formed: would declare A<function>::t
// as a static member function
--- end example]
В переводе на русский - функциональный тип нельзя использовать при объявлении функций в шаблонах. Но можно в обычных классах. Интересно почему именно так?
Altravert 08.02.2010 06:55 # 0
guest 08.02.2010 10:39 # 0
Altravert 09.02.2010 06:03 # 0
guest 10.02.2010 11:32 # 0
guest 06.03.2010 03:17 # 0
guest 17.03.2010 13:20 # 0
Поэтому там в инклюд секции так и написано - "не трогай блядь...., я эту причину два дня искал" :-)
Во общем пора наверно валить с этого проекта, засиделся Я там, да и заказчик не пробиваемый жлоб и идиот.