簡體   English   中英

指向成員變量和模板

[英]Points to member variables and templating

我目前正在使用模板化函數來評估數學函數的導數,就像這樣

template <class func_type>
arma::mat matrixDerivative
   (func_type func, const double x, double h, double b=1.4) {
      // <implementation details>
}

template參數允許我使用函數指針或函子來評估右側。

有沒有簡單的方法可以擴展它,以評估作為類方法的函數的派生類? 我無法全神貫注地使用指向成員函數的函數指針,也無法解決將函子作為類屬性仍然可以訪問其父級的屬性和方法的細節。

我的問題通常不清楚,因此在回答之前,請隨時在評論中要求澄清。

在C ++ 11中,只需使用lambda:

[&]( double x )->double {
  return ptr->method(x);
}

生成一個可以用double調用的函數對象。 上面的構造假定將在當前作用域結束之前使用和丟棄lambda(否則[&]是不安全的)。

請注意,對於C ++ 11中的單行和void返回lambda,可以省略->double ,而對於C ++ 1y中的多行lambda,也可以省略->double如果您可以確定其推導的返回類型(基於第一個)函數中的return語句)。

在C ++ 03中,可以使用std::mem_fun ,也可以創建一個自定義函數對象。

在C ++ 1y中:

[&](auto&&... x) {
  return ptr->method(std::forward<decltype(x)>(x)...);/
}

創建一個完美轉發的函子包裝。 在認真的工業庫代碼之外,即使在C ++ 1y中,我也很少這樣做。 不再那么冗長:

[&](auto&&... x) {
  return ptr->method(x...);
}

這可以讓我們不完美地前進,並將重載的選擇推遲到lambda的使用點,而不是lambda的編寫點,這可能很好。 (如果任何方法使用右值或按值調用,那么回到完美的轉發就很誘人)

在C ++ 11中, std::mem_fn要求所討論的方法不要重載,或者必須手動解決重載(使用看起來像奧秘的強制轉換)。 然后, std::bind用一個完美轉發的函數對象包裝它。 該過程的主要優點是,在定義實現的同時,可以確定構造的類型,因此您可以使用一個函數來返回所討論的類型。 但是,這是一個非常深奧的優勢:我會選擇lambda。

Lambdas雖然很奇怪,但在C ++中卻越來越常見,在我的經驗中,它們比鏈bind mem_fun表達式更容易理解它們在做什么,因為它們看起來更像是“普通”代碼(在克服“魔術”之后)。

暫無
暫無

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

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