Хотя я боюсь, что вы скажете мне, что эта тема обсуждалась несколько раз, я осмеливаюсь спросить об этом, так как я не смог найти решение. Наверное, я просто искал не то...
Предположим, что у меня есть функция, которая получает «режим» от какой-то внешней функции. В зависимости от режима функция будет вызывать разные функции-члены одного и того же объекта. Это хорошо работает для меня с функцией-членом без каких-либо аргументов, но я не нашел, как расширить ее на члены с аргументами. В реальном приложении аргументами являются не int/float, а более сложные классы, и вызов вложен в разные циклы, поэтому мне нужно было бы несколько раз помещать операторы switch, что я считаю уродливым.
Вопрос A: Можно ли легко добавить поддержку функций-членов с аргументами на основе существующего дизайна? Если да, то как это сделать? Если возможно без внешних библиотек...
Вопрос B: Это совершенно неправильный/плохой подход? Как бы мне сделать это лучше?
Большое спасибо за вашу помощь и пояснения.
Крис
выдержка из заголовка:
typedef void (Object::*memberFunction)();
class Object
{
void memberFnNoArg();
void memberFnWithIntArg(int arg);
void memberFnWithFloatArg(float arg);
}
выдержка из cpp:
void function()
{
int mode = getModeFromSomewhere();
int intArg = 33;
float floatArg = 66.6;
switch(mode)
{
case 1:
process(&Object::memberFnNoArg);
break;
case 2:
process(&Object::memberFnWithIntArg, ???); // how can I pass arg?
break;
case 3:
process(&Object::memberFnWithFlaotArg, ???); // how can I pass arg?
break;
default:
// do nothing;
}
}
void process(Object::memberFunction func)
{
Object object;
// loops, called several times, ...
(object.*func)(); // how do I handle different arguments?
}
std::bind
? - person BoBTFish   schedule 04.06.2013