Здравствуйте, 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)); // Получили нужный член класса
};
Хотелось бы иметь такой вариант по аналогии с 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); // Получили нужный член класса
};
Кому интересно для чего это может понадобиться могу привести пример.
Здравствуйте, 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);
}