有没有办法只进行一次函数调用?
假设我有一些课程
struct A {
void MainRoutine(Params) {
// Want to call other routine only once
}
void OtherRoutine(Params) {
// Do something that should be done only once and
// what depends on the params
}
};
我想在OtherRoutine
中仅拨打MainRoutine
一次(我假设MainRoutine
将被称为N
次。我无法呼叫OtherRoutine
来自构造函数,因为它接受Params
,它在构造对象时可能不可用。
基本上我想做像
这样的事情static bool called = false;
if (!called) {
OtherRoutine(Params);
called = true;
}
但我希望有更“美丽”的方式来做这件事...... (可以写成一行)
使用boost::function
或boost
的某些部分我可能不知道的事情? :)
谢谢
答案 0 :(得分:3)
看看Boost Thread的one-time initialization mechanism
答案 1 :(得分:2)
您还可以将已经概述的只调用一次逻辑放在OtherRoutine
中,如果之前已经执行过,则会提前返回。
逻辑上,它几乎一样。在风格上,它可能更好。
答案 2 :(得分:2)
你肯定已走上正轨。你应该把你的静态'被调用'变量放在你的结构中... ahem:你应该把它变成一个类,把它变成私有的,并确保在OtherRoutine中查询静态变量的状态。 你不应该让它变得比它需要的更复杂。对于如此简单的机制使用boost或其他任何东西都是过度的。
答案 3 :(得分:2)
你可以用boost :: function和bind来实现这个目的。假设你只希望每个对象调用一次OtherRoutine,
struct A {
A() {
Routine = boost::bind(&A::OtherRoutine, this);
}
boost::function<void()> Routine;
private:
void MainRoutine() {
// Do stuff that should occur on every call
}
void OtherRoutine() {
Routine = boost::bind(&A::MainRoutine, this);
// Do stuff that should only occur once
MainRoutine();
}
};
A foo;
foo.Routine(); // OtherRoutine is called
foo.Routine(); // Now all subsequent calls will go to MainRoutine
foo.Routine();
我建议做其他人说的话。虽然这可能看起来“更清洁”,但与替代品相比,它过于复杂。
答案 4 :(得分:0)
另一种接近“可爱”的方法是拥有一个静态对象并在其构造函数中调用您的函数。有点像...
struct OneShotOtherRoutine
{
OneShotOtherRoutine(A a, Params params)
{
a.OtherRoutine(params);
}
};
struct A
{
friend struct OneShotOtherRoutine;
public:
void MainRoutine(Params params)
{
static OneShotOtherRoutine(params);
// Main Routine code
}
private:
void OtherRoutine(Params params)
{
// Other routine code
}
};
你必须拆分,以便每个实现都可以看到其他结构的声明,但这可以做你想要的,假设在初始化静态时调用OtherRoutine
是可以接受的。