Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Велосипед и VC6 (число прочтений - 2219 )
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Велосипед и VC6
12. Февраля 2007 :: 13:50
Печать  
Есть вопрос, представляющий, скорее, академический интерес. Вот изобрел такой вот простенький велосипед:
Код
Выбрать все
class CGlobalPointer  
{
public:
	CGlobalPointer (HGLOBAL hGlobal)
	{
		ASSERT (hGlobal);
		m_hGlobal = hGlobal;
		m_Pointer = GlobalLock (hGlobal);
		ASSERT (m_Pointer);
	};
	virtual ~CGlobalPointer()
	{
		GlobalUnlock (m_hGlobal);
	};

	operator LPVOID ()
	{
		return m_Pointer;
	};

	template<typename T> operator T* ()
	{
		return (T *)m_Pointer;
	};
protected:
	HGLOBAL m_hGlobal;
	void *m_Pointer;

	CGlobalPointer() {;};
	void operator = (const CGlobalPointer &) {;};
};
 



Использование:
Код
Выбрать все
	CGlobalPointer GPDevMode (pd.hDevMode);
	DEVMODE *pDevMode = (DEVMODE *)GPDevMode;
 


Все без проблем работает в Intel C++, но VC6, похоже, просто не видит шаблон и ругается на "DEVMODE *pDevMode = (DEVMODE *)GPDevMode". Вопрос следующий: реально ли в VC6 получить такой же класс (с таким же приведением к любому нужному указателю) без необходимости определять в классе операторы преобразования во все используемые типы?
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Велосипед и VC6
Ответ #1 - 12. Февраля 2007 :: 17:00
Печать  
А если вот так попробовать?
Код
Выбрать все
	template<typename T> operator T ()
	{
		return (T)m_Pointer; // или static_cast
	};
 


т.е без указателей?
ЗЫ очень коряво, конечно Печаль
слишком легко можно любой тип, а не только указатели, преобразовать Печаль
ЗЗЫ под рукой нет МС ВС++ - проверить не могу.

Или делай полностью шаблонный класс Печаль
Тогда все будет ок, хотя размер файла, конечно, увеличится Улыбка
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer &amp;&amp; tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: Велосипед и VC6
Ответ #2 - 13. Февраля 2007 :: 08:12
Печать  
Это в VC6 косяк такой - не может вывести шаблонную функцию, если нет аргументов функции, задающих тип параметра шаблона.
  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: Велосипед и VC6
Ответ #3 - 14. Февраля 2007 :: 07:46
Печать  
имхо правильнее и логичнее было бы так:
Код
Выбрать все
class CGlobalPointerBase
{
public:
	~CGlobalPointerBase()
	{
		GlobalUnlock (m_hGlobal);
	};

	operator LPVOID ()
	{
		return m_Pointer;
	};

protected:
	CGlobalPointerBase (HGLOBAL hGlobal)
	{
		ASSERT (hGlobal);
		m_hGlobal = hGlobal;
		m_Pointer = GlobalLock (hGlobal);
		ASSERT (m_Pointer);
	};
	HGLOBAL m_hGlobal;
	void *m_Pointer;
	void operator = (const CGlobalPointerBase &) {}
};

template <typename T>
class CGlobalPointer  : public CGlobalPointerBase
{
public:
	CGlobalPointer (HGLOBAL hGlobal)
		:CGlobalPointerBase(hGlobal){}
	operator T* ()
	{
		return (T*) m_Pointer;
	};
};

 

  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать