У меня это есть.
Функция DoJob()
будет принимать различные " verify
" функтор проверить вещи по - разному. Для проверки функции можно передать некоторую переменную, такую как " message
". Или, возможно, не передать какой-либо параметр для проверки функции.
и теперь DoJob
является функцией одноэлементного класса. Я могу использовать getInstance()
где угодно, чтобы получить этот класс. Основываясь на этом, как мне определить DoJob
и verify
интерфейс?
Благодаря,
Одиночный класс:
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");
DoJob
.
Для этого вы можете использовать вариационный шаблон С++ 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
).
Следуйте ссылке для рабочей демонстрации.