Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.06.2012, 19:12   #1
pror0ck
 
Регистрация: 28.02.2010
Сообщений: 6
По умолчанию получение ссылки на функцию из класса шаблона и передача ее как параметр шаблона

Доброго времени суток!
Получилась вот такая странная проблема, хотя не понимаю почему в С++ возникают ошибки в таком случае

Код:

template <class _Type, class _Owner>
class Prop
{
public:

	template <const _Type &(_Owner::*_Get)()>
	class Pr
	{
	public:

		Pr(_Owner *obj)
		{
			m_Object = obj;
		}

		operator int()
		{
			return (m_Object->*_Get)();
		}

	protected:

		_Owner *m_Object;
	};
};


template <class _Type>
class Test
{
protected:

	_Type m_Val;

	const _Type &SetVal(const _Type &val)
	{
		return (m_Val = val);
	}

	const _Type &GetVal()
	{
		return m_Val;
	}

public:

	Prop<_Type, Test<_Type>>::Pr<&Test<_Type>::GetVal> Prop;
	
	Test()
		: Prop(this)
	{
		
	}
};


int main( int argc, const char* argv[] )
{
	Test<int> test;


}
Выдает ошибки примерно такие
Ошибка 4 error C2146: синтаксическая ошибка: отсутствие ";" перед идентификатором "Prop"
Ошибка 5 error C2208: Prop: нет членов, определенных с помощью этого типа

И такой странный warning
Предупреждение 3 warning C4346: Prop<_Type,Test<_Type>>::Pr<&Test<_ Type>::GetVal>: зависимое имя не является типом

Хотя я пробовал ставить typename в нужных местах, но это тоже не помогло

Помогите пожалуйста!
pror0ck вне форума Ответить с цитированием
Старый 13.06.2012, 19:44   #2
pror0ck
 
Регистрация: 28.02.2010
Сообщений: 6
По умолчанию

Нашел решение
нужно вместо Prop<_Type, Test<_Type>>::Pr<&Test<_Type>::GetV al> Prop; написать
typename Prop<_Type, Test<_Type>>::Pr<&Test<_Type>::GetV al> Prop;
pror0ck вне форума Ответить с цитированием
Старый 13.06.2012, 21:14   #3
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Можешь показать юзкейс задумки, а заодно объяснить шо сие вообще такое?
_Bers вне форума Ответить с цитированием
Старый 13.06.2012, 23:06   #4
pror0ck
 
Регистрация: 28.02.2010
Сообщений: 6
По умолчанию

Могу показать весь код, хотя он еще не доведен до идеала.
Это попытка сделать аналог property как в VB .Net и C#

Код:

template <class _Type, class _OwnType>
class Property
{
public:

	template <const _Type &(_OwnType::*_GetFunc)(), const _Type &(_OwnType::*_SetFunc)(const _Type&)>
	class ReadWrite 
	{
	protected:

		int m_Offset;

	public:

		ReadWrite(_OwnType *obj)
		{
			m_Offset = (char*)this - (char*)obj;
		}

		const _Type &operator =(_Type &&val)
		{
			_OwnType* owner = (_OwnType*)((char*)this-(char*)m_Offset);
			return (owner->*_SetFunc)(val);
		}

		operator const _Type&()
		{
			_OwnType* owner = (_OwnType*)((char*)this-(char*)m_Offset);
			return (owner->*_GetFunc)();
		}
	};

	template <const _Type &(_OwnType::*_GetFunc)()>
	class ReadOnly 
	{
	protected:

		int m_Offset;

	public:
		
		ReadOnly(_OwnType *obj)
		{
			m_Offset = (char*)this - (char*)obj;
		}

		operator const _Type&()
		{
			_OwnType* owner = (_OwnType*)((char*)this-(char*)m_Offset);
			return (owner->*_GetFunc)();
		}
	};

	template <const _Type &(_OwnType::*_SetFunc)(const _Type&)>
	class WriteOnly 
	{
	protected:

		int m_Offset;

	public:
		
		WriteOnly(_OwnType *obj)
		{
			m_Offset = (char*)this - (char*)obj;
		}

		const _Type &operator =(_Type &&val)
		{
			_OwnType* owner = (_OwnType*)((char*)this-(char*)m_Offset);
			return (owner->*_SetFunc)(val);
		}
	};
};

И этот класс Property используется в другом классе-шаблоне. А когда используется тип данных образованный шаблоном в шаблоне нужно его помечать как typename. Это вывод который я сделал


Используется примерно так

Код:
Property<int, ClassWitchUsedProperty>::ReadOnly<&ClassWitchUsedProperty::_GetLength> Length;

Последний раз редактировалось pror0ck; 13.06.2012 в 23:10.
pror0ck вне форума Ответить с цитированием
Старый 13.06.2012, 23:14   #5
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

а использование показать можешь?
У меня вот это даже не скомпилировалось. Куча ошибок, ссылка на ссылку и тп не понравилось гцц
_Bers вне форума Ответить с цитированием
Старый 14.06.2012, 09:45   #6
pror0ck
 
Регистрация: 28.02.2010
Сообщений: 6
По умолчанию

Насчет gcc незнаю, не пробовал там откомпилировать. Но по идее все должно работать. С++ он везде одинаковый и никаких фич майкрософта я тут не использую. Сам компилирую под Visual Studio.
Вот пример использования:

Код:

class MySuperClass
{
public:

MySuperClass()
           : Length(this)
{
    m_Val = 5;
}

Property<int, MySuperClass>::ReadOnly<&MySuperClass::_GetLength> Length;

protected:

int m_Val;

const int &_GetLength()
{
    return m_Val;
}
};


void main()
{
     MySuperClass super_class;

     int b = super_class.Length;    ///в b запишется 5
}
pror0ck вне форума Ответить с цитированием
Старый 17.06.2012, 15:05   #7
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

у меня под студией 2008 не собрался.

Собственно:

Код:
// : error C2143: синтаксическая ошибка: отсутствие ")" перед "&&"
 const _Type &operator =(_Type &&val)
Насколько я знаю, ссылки на ссылки не допустимы.
_Bers вне форума Ответить с цитированием
Старый 17.06.2012, 15:06   #8
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Код:
//: error C2065: _GetLength: необъявленный идентификатор
Property<int, MySuperClass>::ReadOnly<&MySuperClass::_GetLength> Length;
Метод отсутствует в классе
_Bers вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Использование файлов XLS в качестве шаблона и отображение этого шаблона в приложении Delphi? vodyara Общие вопросы Delphi 0 23.04.2012 13:13
Передача Property как Var параметр в функцию sdsfy Общие вопросы Delphi 11 21.09.2011 23:01
c++, проверка шаблона класса DimR Помощь студентам 0 06.06.2011 20:18
Шаблон как параметр шаблона Сtrl Общие вопросы C/C++ 7 02.06.2011 22:18
Передача ссылки в функцию класса на данный класс Impuls1989 Общие вопросы C/C++ 17 09.01.2010 17:21