C ++ - 基本功能问题

时间:2010-08-01 02:32:58

标签: c++ function call

有没有办法只进行一次函数调用?

假设我有一些课程

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::functionboost的某些部分我可能不知道的事情? :)

谢谢

5 个答案:

答案 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是可以接受的。