簡體   English   中英

如何在構造函數的成員初始值設定項列表中調用兩個函數?

[英]How can I call two functions in contructor's member initializer list?

我可以調用初始化列表中的函數嗎? 請看這個代碼:

#include <string>
using namespace std;

class A {
 public:
  A(string path) : s(cfg.getRoot()) {  // before i call getRoot, i need to call cfg.readFile(path.c_str()), is there any methods? (readFile return void)
  }

  private:
   libconfig::Config cfg;
   const libconfig::Setting & s;  // const &, so initalizer list is the only chance for me to init it
}

您需要將它包裝到一個函子中,例如static成員函數或 lambda(C++11 起):

A(string path) : s([this]() -> const libconfig::Setting & 
                   { cfg.readFile(path.c_str()); return cfg.getRoot(); }
                   () 
                  ) 
{}

您還可以使用逗號運算符(盡管這可能會或可能不會讓讀者更難理解):

A(string path) : s((cfg.readFile(path.c_str()), cfg.getRoot())) {}

內置逗號運算符從左到右計算並丟棄左側表達式的結果。 請注意,雙括號是必需的。 否則,它將被解析為s的構造函數的兩個函數參數。

如果cfg.readFile(path.c_str())的返回類型有一個重載的逗號操作符(但這非常罕見),這將無法正常工作。 在這種情況下,您需要將結果強制轉換為void以丟棄返回值:

A(string path) : s((static_cast<void>(cfg.readFile(path.c_str())), cfg.getRoot())) {}

已經給出了 lambda 方法。 如果使用decltype(auto)則可以避免重復返回類型:

A(string path) : s([this]()->decltype(auto){
    cfg.readFile(path.c_str());
    return cfg.getRoot();
}()) {}

這又是一個風格問題,無論您是否喜歡明確地給出返回類型。

正如@songyuanyao 在下面的評論中所指出的,如果沒有指定返回類型或適當的占位符,那么如果cfg.getRoot返回引用就會遇到麻煩,因為默認的 lambda 類型是auto占位符,這會導致構造來自引用的臨時對象,然后您將綁定到s並將立即再次銷毀。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM