Люди, вопрос про стандартный STL или BOOST
От: Stas Chistyakov Россия  
Дата: 03.01.03 20:13
Оценка:
Скажите пожалуйста, есть ли какой либо аналог mem_fun, но надо закрепить не функцию-член, а переменную член. Вобщем, просто хотелось бы использовать в стандартных алгоритмах типа find_if, ..... но не писать своих функторов
... << RSDN@Home 1.0 beta 4 >>
Re: Люди, вопрос про стандартный STL или BOOST
От: Mozhay Россия www.mozhay.chat.ru
Дата: 04.01.03 07:51
Оценка:
Здравствуйте, 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;
}
Re[2]: Люди, вопрос про стандартный STL или BOOST
От: Stas Chistyakov Россия  
Дата: 04.01.03 10:09
Оценка:
Э-э-э ну, вообще-то далеко не это спрашивал, а вот это
class CData
{
CString sName1;
CString sName2;
........
CString sNameN;
}

Интересно, можно ли создать аналог mem_fun, т.е. закрепить какой либо sNameX, а затем с помощью полученного функтора — передавать ему CData*, а получать sNameX (в принципе я вроде так и сказал )
... << RSDN@Home 1.0 beta 4 >>
Re[3]: Люди, вопрос про стандартный STL или BOOST
От: Mozhay Россия www.mozhay.chat.ru
Дата: 04.01.03 10:29
Оценка:
Здравствуйте, 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>


Действительно, попал пальцем в небо, сорри
Теперь вопрос понятен. Думаю, что все таки надо будет самому написать...
Re[4]: Люди, вопрос про стандартный STL или BOOST
От: Stas Chistyakov Россия  
Дата: 04.01.03 10:42
Оценка:
Как я понимаю, наверно такого сделать нельзя, но мало ли. Там вопрос можно упростить.
Просто указатель на функцию-член состоит из двух составляющих: указатель на экземпляр класса и на смещение функции в этом классе.
Указатель на переменную-член состоит просто из указателя на переменную-член
Весь вопрос состоит в том, можно ли представить указатель так же как и с функцией, если да, то значит все что я спрашивал можно, если нет, то нельзя. Я уверен, что нельзя, но почему-то что-то внутри ноет.
... << RSDN@Home 1.0 beta 4 >>
Re[3]: Люди, вопрос про стандартный STL или BOOST
От: Gadsky Россия  
Дата: 04.01.03 11:00
Оценка:
Здравствуйте, Stas Chistyakov, Вы писали:

/* 
 * Абстрактный метакласс 
 */
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. Для твоих целей полиморфность может и не нужна, так что можно возвращать типизированный указатель или ссылку.
Re[3]: Люди, вопрос про стандартный STL или BOOST
От: MaximE Великобритания  
Дата: 04.01.03 16:01
Оценка:
Здравствуйте, 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).
Re[4]: Люди, вопрос про стандартный STL или BOOST
От: MaximE Великобритания  
Дата: 04.01.03 16:02
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>Такого стандартного функтора нет.

ME>И нет его, видимо, потому, что бы не провоцировать людей на нарушение инкапсуляции (т.е. делать члены public).

Но создать свой ты можешь элементарно.
Re[5]: Люди, вопрос про стандартный STL или BOOST
От: Stas Chistyakov Россия  
Дата: 05.01.03 06:36
Оценка:
ME>Но создать свой ты можешь элементарно.
Создать на каждую переменную по функтору — элементарно, собственно весь вопрос был про более менее универсальный, т.е. переменная член должна была бы фиксиковаться в конструкторе функтора
... << RSDN@Home 1.0 beta 4 >>
Re[4]: Люди, вопрос про стандартный STL или BOOST
От: Stas Chistyakov Россия  
Дата: 05.01.03 06:36
Оценка:
ME>Такого стандартного функтора нет.
ME>И нет его, видимо, потому, что бы не провоцировать людей на нарушение инкапсуляции (т.е. делать члены public).

Ну это мало связанные проблемы, просто данный код можно использовать для реализации закрытых функций, которые как раз с закрытыми переменными и общаются
... << RSDN@Home 1.0 beta 4 >>
Re[6]: Люди, вопрос про стандартный STL или BOOST
От: Gadsky Россия  
Дата: 05.01.03 07:23
Оценка: 26 (4)
Здравствуйте, Stas Chistyakov, Вы писали:

SC>Создать на каждую переменную по функтору — элементарно, собственно весь вопрос был про более менее универсальный, т.е. переменная член должна была бы фиксиковаться в конструкторе функтора



#include <cassert>

template <typename Class, typename FieldClass>
class Field {
public:
    typedef FieldClass Class::*FieldOffset;
            
private:
    FieldOffset fieldOffset;

public:
    FieldClass &operator () (Class &value) { return value.*fieldOffset; }
    Field(FieldOffset fieldOffset): fieldOffset(fieldOffset) {}
};

struct Test {
    int a;
    char *b;
};

void main() {
    Field<Test, int> aField(&Test::a);
    Field<Test, char *> bField(&Test::b);

    Test test;
    test.a = 1;
    char *temp = "bebe";
    test.b = temp;

    assert(aField(test) == 1);
    assert(bField(test) == temp);
}


Или я чего-то не понял?
Re[7]: Люди, вопрос про стандартный STL или BOOST
От: Stas Chistyakov Россия  
Дата: 05.01.03 07:46
Оценка:
Все спасибо, Просто праздники еще не прошли. СПАСИБО
... << RSDN@Home 1.0 beta 4 >>
Re[4]: Интересно где это было нужно?
От: vgrigor1  
Дата: 08.01.03 16:20
Оценка:
Не скажете зачем такая вещь нужна вообще,
практичекая цель, и
какую концепцию вы реализовывали (практичекую)?

Статичекие члены в классах кажется есть...Синоним гловальных.
Получение поля, автоматически происходит в шаблонах
по имени, с помощью компилятора, нет?
(я не очень понял, поясните плз.)
Винтовку добудешь в бою!
Re[5]: Интересно где это было нужно?
От: Gadsky Россия  
Дата: 09.01.03 06:03
Оценка:
Здравствуйте, vgrigor1, Вы писали:

V>Не скажете зачем такая вещь нужна вообще,

V>практичекая цель, и
V>какую концепцию вы реализовывали (практичекую)?

V>Статичекие члены в классах кажется есть...Синоним гловальных.

V>Получение поля, автоматически происходит в шаблонах
V>по имени, с помощью компилятора, нет?
V>(я не очень понял, поясните плз.)

Это только небольшой кусок. Вообще-то это для создания метаклассов, что-то типа Reflection. В основном для сериализации в разные источники: stream, XML, SQL
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.