c ++ передать функтор и параметр в один метод

0

У меня это есть.

Функция DoJob() будет принимать различные " verify " функтор проверить вещи по - разному. Для проверки функции можно передать некоторую переменную, такую как " message ". Или, возможно, не передать какой-либо параметр для проверки функции.

и теперь DoJob является функцией одноэлементного класса. Я могу использовать getInstance() где угодно, чтобы получить этот класс. Основываясь на этом, как мне определить DoJob и verify интерфейс?

Благодаря,

  • 2
    Можем ли мы увидеть код? Трудно дать совет, если мы не видим, с чем вы работаете.
Теги:
oop
design
interface
functor

2 ответа

1
Лучший ответ

Одиночный класс:

struct MySingleton
{
    static MySingleton* getInstance();

    // DoJob for verify functions that need a message.
    void DoJob(void (*verify)(std::string const&), std::string const& message)
    {
       verify(message);
    }

    // DoJob for verify functions that don't need a message.
    void DoJob(void (*verify)())
    {
       verify();
    }
};

Функция, которая будет использоваться для проверки.

void verify1(std::string const& message)
{
   // Do something with message
}

Используйте синглтон и функцию проверки.

MySingleton::getInstance()->DoJob(verify1, "A message");
  • 0
    спасибо, похоже хорошо. позвольте мне переварить это.
  • 0
    Добавьте перегруженный DoJob .
Показать ещё 2 комментария
0

Для этого вы можете использовать вариационный шаблон С++ 11.

class Foo {
    //... 
public:
    static Foo & getInstance() {
        static Foo instance;
        return instance;
    }
    template <typename V, typename ...X>
    void DoJob (V verify, X... x) {
        verify(x...);
    } 
};

struct Vvoid {
    void operator () (void) {}
};

struct Vstring {
    void operator () (std::string) {}
};

void Vfunction (void) {}

//...
    Foo &f = Foo::getInstance();
    f.DoJob(Vvoid());
    f.DoJob(Vstring(), "msg");
    f.DoJob(Vfunction);

Обратите внимание, что Vvoid и Vstring являются истинными функторами (экземпляры объектов, которые можно вызвать как функцию с оператором ()). Но синтаксис шаблона позволяет передавать любой вызываемый экземпляр, включая регулярные указатели функций (например, Vfunction).

Следуйте ссылке для рабочей демонстрации.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню