Здравствуйте, Stas Chistyakov, Вы писали:
SC>Создать на каждую переменную по функтору — элементарно, собственно весь вопрос был про более менее универсальный, т.е. переменная член должна была бы фиксиковаться в конструкторе функтора
Скажите пожалуйста, есть ли какой либо аналог mem_fun, но надо закрепить не функцию-член, а переменную член. Вобщем, просто хотелось бы использовать в стандартных алгоритмах типа find_if, ..... но не писать своих функторов
Здравствуйте, Stas Chistyakov, Вы писали:
SC>Скажите пожалуйста, есть ли какой либо аналог mem_fun, но надо закрепить не функцию-член, а переменную член. Вобщем, просто хотелось бы использовать в стандартных алгоритмах типа find_if, ..... но не писать своих функторов
Вероятно, имеется в виду что-то типа:
#include <iostream>
#include <algorithm>
#include <vector>
#include <functional>
using namespace std;
int main()
{
typedef vector<int> VI;
VI v;
for (int i=0; i<100; ++i) v.push_back(i);
VI::iterator it = find_if(v.begin(), v.end(), bind2nd(equal_to<int>(), 3));
if (it != v.end())
cout << (*it) << '\n';
return 0;
}
Э-э-э ну, вообще-то далеко не это спрашивал, а вот это
class CData
{
CString sName1;
CString sName2;
........
CString sNameN;
}
Интересно, можно ли создать аналог mem_fun, т.е. закрепить какой либо sNameX, а затем с помощью полученного функтора — передавать ему CData*, а получать sNameX (в принципе я вроде так и сказал )
Здравствуйте, Stas Chistyakov, Вы писали:
SC>Э-э-э ну, вообще-то далеко не это спрашивал, а вот это SC>class CData SC>{ SC> CString sName1; SC> CString sName2; SC> ........ SC> CString sNameN; SC>}
SC>Интересно, можно ли создать аналог mem_fun, т.е. закрепить какой либо sNameX, а затем с помощью полученного функтора — передавать ему CData*, а получать sNameX (в принципе я вроде так и сказал )
SC>
Действительно, попал пальцем в небо, сорри
Теперь вопрос понятен. Думаю, что все таки надо будет самому написать...
Как я понимаю, наверно такого сделать нельзя, но мало ли. Там вопрос можно упростить.
Просто указатель на функцию-член состоит из двух составляющих: указатель на экземпляр класса и на смещение функции в этом классе.
Указатель на переменную-член состоит просто из указателя на переменную-член
Весь вопрос состоит в том, можно ли представить указатель так же как и с функцией, если да, то значит все что я спрашивал можно, если нет, то нельзя. Я уверен, что нельзя, но почему-то что-то внутри ноет.
/*
* Абстрактный метакласс
*/class IClass;
/*
* Абстрактное поле объекта. Имя поля + возможность получить его адрес.
* Статические поля пока не поддерживаются.
*/class IField {
private:
const wstring name;
protected:
IField(const wstring &name): name(name) {}
public:
const wstring &getName() const { return name; }
virtual const IClass &getClass() const = 0;
virtual const void *getFieldPointer(const void *value) const = 0;
virtual ~IField() {}
};
/*
* Шаблон поля. Определяет указатель на поле относительно объекта.
* Определяет имя поля и его метакласс.
*/template <typename Type, typename FieldClass>
class Field: public IField {
public:
typedef const FieldClass::Type Type::*FieldOffset;
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^private:
FieldOffset fieldOffset;
public:
virtual const IClass &getClass() const { return FieldClass::get(); }
virtual const void *getFieldPointer(const void *value) const {
return &(((const Type*)value)->*fieldOffset);
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
}
Field(FieldOffset fieldOffset, const wstring &name):
IField(name), fieldOffset(fieldOffset)
{}
};
Это кусок кода из моих работ. Первый класс — интерфейс произвольного поля произволного класса. Второй — темплейтная реализация этого поля. Объекту передается указатель на объект, возвращается указатель на поле. Для моих целей это указатель на void. Для твоих целей полиморфность может и не нужна, так что можно возвращать типизированный указатель или ссылку.
Здравствуйте, Stas Chistyakov, Вы писали:
SC>Э-э-э ну, вообще-то далеко не это спрашивал, а вот это SC>class CData SC>{ SC> CString sName1; SC> CString sName2; SC> ........ SC> CString sNameN; SC>}
SC>Интересно, можно ли создать аналог mem_fun, т.е. закрепить какой либо sNameX, а затем с помощью полученного функтора — передавать ему CData*, а получать sNameX (в принципе я вроде так и сказал )
Такого стандартного функтора нет.
И нет его, видимо, потому, что бы не провоцировать людей на нарушение инкапсуляции (т.е. делать члены public).
Здравствуйте, MaximE, Вы писали:
ME>Такого стандартного функтора нет. ME>И нет его, видимо, потому, что бы не провоцировать людей на нарушение инкапсуляции (т.е. делать члены public).
ME>Но создать свой ты можешь элементарно.
Создать на каждую переменную по функтору — элементарно, собственно весь вопрос был про более менее универсальный, т.е. переменная член должна была бы фиксиковаться в конструкторе функтора
ME>Такого стандартного функтора нет. ME>И нет его, видимо, потому, что бы не провоцировать людей на нарушение инкапсуляции (т.е. делать члены public).
Ну это мало связанные проблемы, просто данный код можно использовать для реализации закрытых функций, которые как раз с закрытыми переменными и общаются
Не скажете зачем такая вещь нужна вообще,
практичекая цель, и
какую концепцию вы реализовывали (практичекую)?
Статичекие члены в классах кажется есть...Синоним гловальных.
Получение поля, автоматически происходит в шаблонах
по имени, с помощью компилятора, нет?
(я не очень понял, поясните плз.)
Здравствуйте, vgrigor1, Вы писали:
V>Не скажете зачем такая вещь нужна вообще, V>практичекая цель, и V>какую концепцию вы реализовывали (практичекую)?
V>Статичекие члены в классах кажется есть...Синоним гловальных. V>Получение поля, автоматически происходит в шаблонах V>по имени, с помощью компилятора, нет? V>(я не очень понял, поясните плз.)
Это только небольшой кусок. Вообще-то это для создания метаклассов, что-то типа Reflection. В основном для сериализации в разные источники: stream, XML, SQL