[英]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.