簡體   English   中英

在 C++ 函數中重用訪問結構不同屬性的代碼

[英]Reuse code in C++ functions that access different attributes of struct

我有一個結構

struct doodle
{
  int x;
  int y;
};

和 2 個相同的方法,除了它們使用struct doodle的不同屬性:

void ProcessDoodlesHorizontally(std::vector<struct doodle>& v_doodles)
{
    for (unsigned int i=0; i<v_doodles.size(); i++)
    {
      int x = v_doodles.at(i).x;
      std::cout<<x<<std::endl;
    }
}

void ProcessDoodlesVertically(std::vector<struct doodle>& v_doodles)
{
    for (unsigned int i=0; i<v_doodles.size(); i++)
    {
      int y = v_doodles.at(i).y;
      std::cout<<y<<std::endl;
    }
}

我想制作一個 function ProcessDoodlesGeneric ,它可以作為關於我是否對 doodle.x 或 doodle.y 感興趣的參數信息。 這可能嗎? 如果不是,在此示例中重用代碼的替代方法是什么?

由於函數之間的唯一區別是使用哪個數據成員,您可以傳入一個指向數據成員的指針(這在這里有效,因為兩個數據成員屬於同一類型):

void Process(std::vector<struct doodle>& v_doodles, int doodle::* field)
{
  for (auto &doodle : v_doodles)
      std::cout<< doodle.*field << std::endl;
}

void ProcessDoodlesHorizontally(std::vector<struct doodle>& v_doodles)
{
  Process(v_doodles, &doodle::x);
}

void ProcessDoodlesVertically(std::vector<struct doodle>& v_doodles)
{
  Process(v_doodles, &doodle::y);
}

請注意,我稍微清理了 for 循環以使其更易於閱讀。

這是一個演示

一個簡單的bool參數用於決定在這種情況下使用哪個屬性,因為只有兩個選項。

如果你有更復雜的情況,你可以使用指向成員的指針:

void ProcessDoodlesGeneric(std::vector<doodle>& v_doodles, int doodle::*member)
{
    for (unsigned int i=0; i<v_doodles.size(); i++)
    {
      int member_val = v_doodles.at(i).*member;
      std::cout << member_val << std::endl;
    }
}

int main()
{
    std::vector<doodle> doodles = { {1, 2}, {3, 4}, {5, 6} };
    ProcessDoodlesGeneric(doodles, &doodle::x);
    ProcessDoodlesGeneric(doodles, &doodle::y);
}

現場演示

鑒於這兩個函數之間的唯一區別是您從哪個屬性讀取,您可以向 function 添加一個 boolean 參數來確定您是從x還是y屬性讀取。

void ProcessDoodlesGeneric(std::vector<struct doodle>& v_doodles, bool horizontal)
{
    for (unsigned int i=0; i<v_doodles.size(); i++)
    {
      int output;
      if(horizontal) output = v_doodles.at(i).x;
      else output = v_doodles.at(i).y
      std::cout<<output<<std::endl;
    }
}

一個簡單的方法是合並函數。 有一個額外的變量是方向:

void ProcessDoodles(std::vector<struct doodle>& v_doodles, direction_enum dir)
{
    for (unsigned int i=0; i<v_doodles.size(); i++)
    {
        int val;
        if (dir == direction_enum::vertical)
        {
           val = v_doodles.at(i).y;
        }
        else
        {
           val = v_doodles.at(i).x;
        }
        std::cout << val << std::endl;
    }
}

其中direction_enum可以是枚舉或 int 或 bool 或其他任何東西。

注意:這會比較慢,因為你會產生額外的“if”,但我猜分支預測可以緩解這種情況。 可能有更好的方法——這只是合並 function 的一種非常簡單的方法——你獲取所有變量,它們變成 function 參數……事實上,一些 IDE 會為你做這個(在重構菜單下)

暫無
暫無

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

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