Re[2]: Получение поля класса с помощью шаблона
От: denisku Россия  
Дата: 25.08.04 08:43
Оценка: 3 (1)
Здравствуйте, denisku, Вы писали:

[...]

Вот что у меня в итоге получилось(добавил темплейтное значение возврата):


class test_class {
    public:
     int a;

     test_class() : a(5) {}
};
//---------------------------------------------------
template <class T, class U>
U doProcessing(T& obj, U T::* x) {
    return(obj.*x);
}
//---------------------------------------------------
int main(int argc, char** argv) {
    test_class obj;

    std::cout << doProcessing(obj, &test_class::a);
 return(0);
}
Извините за потраченный траффик..
Re: Получение поля класса с помощью шаблона
От: Nuald Россия http://nuald.blogspot.com
Дата: 25.08.04 08:27
Оценка: 2 (1)
Здравствуйте, Analitic, Вы писали:

A>Для обычного члена класса — переменной

A>class a
A>{
A>public:
A> int b;
A>};

A>template<typename A>

A>int doProcessing — а вот тут и сама задача, как описать функцию для получения значения переменной члена класса

ИМХО, плохой дизайн — вы неявно даете прямой доступ к переменной (я не говорю уже о том, что она public).
Оффтоп, но в данном случае я бы видел такое решение (хотя оно не коррелируется с вашим):
class a {
public:
  int b() { return 555 };
};

template <class T> int doProcessing(T a) {
  return a();
}

main(...) {
  A a;
  int i = doProcessing(bind1st(mem_fun(&A::b), &a)); // Получили нужный член класса
};
Получение поля класса с помощью шаблона
От: Analitic Россия  
Дата: 25.08.04 07:40
Оценка:
Хотелось бы иметь такой вариант по аналогии с mem_fun, которая для класса вызывает определенную член этого класса функцию,написать универсальную функцию, ну либо функтор, который бы получал значение переменной члена класса по его имени.
Код привожу ниже:
Для функции
class a
{
public:
int b(){return 555};
};

template<typename A>
int doProcessing(
A& a,
void (A::*method)() // Передаем указатель на функцию
)
{
return (a.*method)(); // Непосредственно вызываем ее
}

main(...)
{
A a;
int i;

i = doProcessing(a, A::b); // Вызвали нужную функцию

};
Для обычного члена класса — переменной
class a
{
public:
int b;
};

template<typename A>
int doProcessing — а вот тут и сама задача, как описать функцию для получения значения переменной члена класса


main(...)
{
A a
int i;
i = doProcessing(a, A::b); // Получили нужный член класса
};

Кому интересно для чего это может понадобиться могу привести пример.
Учиться, учиться и еще раз учиться...
Re: Получение поля класса с помощью шаблона
От: denisku Россия  
Дата: 25.08.04 08:11
Оценка:
Здравствуйте, Analitic, Вы писали:

A>Хотелось бы иметь такой вариант по аналогии с mem_fun, которая для класса вызывает определенную член этого класса функцию,написать универсальную функцию, ну либо функтор, который бы получал значение переменной члена класса по его имени.


Так пойдет? Только единственное, что надо указывать адрес переменной..(через амперсанд). Кстати, насколько я понимаю, когда ты передаешь адрес функции, надо тоже писать с амперсандом(по стандарту).
template <class T, class U>
int doProcessing(T& obj, U x) {
    int T::* ptr = x;
    return(obj.*ptr);
}
//---------------------------------------------------
class test_class {
    public:
     int a;

     test_class() : a(5) {}
};
//---------------------------------------------------
int main(int argc, char** argv) {
    test_class obj;

    std::cout << doProcessing(obj, &test_class::a);
 return(0);
}
Извините за потраченный траффик..
Re: Получение поля класса с помощью шаблона
От: MaximE Великобритания  
Дата: 25.08.04 08:15
Оценка:
Здравствуйте, Analitic, Вы писали:

Analitic wrote:

Используй boost::bind

struct some
{
    int i;
    int foo() const { return i; }
};
 
template<class T>
void f(T const& t)
{
    std::cout << t() << '\n';
}
 
// если шаблон ф-ции не устраивает, то нешаблонная ф-ция
void g(boost::function<int()> const& f)
{
    std::cout << f() << '\n';
}
 
int main()
{
    some s = { 10 };
 
    f(boost::bind(&some::foo, &s));
    f(boost::bind(&some::i, &s));
 
    g(boost::bind(&some::foo, &s));
    g(boost::bind(&some::i, &s));
}


Вывод:
10
10
10
10


--
Maxim Yegorushkin
Re[2]: Получение поля класса с помощью шаблона
От: Analitic Россия  
Дата: 25.08.04 09:05
Оценка:
Здравствуйте, ALL

Спасибо господа,реально помогли
Учиться, учиться и еще раз учиться...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.