我有这个要做。
功能DoJob()
会采用不同的" verify
"仿函数以不同的方式验证事物。
可以传递一些变量,例如" message
"验证功能。
或者,它可能不传递任何参数来验证功能。
现在,DoJob
是单例类的函数。我可以在任何地方使用getInstance()
来获得此课程。
基于此,如何定义DoJob
和verify
接口?
谢谢,
答案 0 :(得分: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");
答案 1 :(得分:0)
您可以使用C ++ 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
)。