[英]Using a struct to pass multiple values
所以我有一個需要兩個字符和兩個整數的函數:
void need_2xcha_2xint(char a, char b, int x, int y)
{
cout << "Working! a: " << a << ", b: " << b << ", x : " << x << ", y: " << y << ".\n";
}
我想通過傳遞包含四個值的單個結構來調用它:
struct Value_Holder
{
char a;
char b;
int x;
int y;
Value_Holder()
: a('g'), b('h'), x(3), y(5)
{
}
};
我希望能夠這樣稱呼它:
Value_Holder vh;
need_2xcha_2xint(vh);
當然,我可以編寫另一個接受我的自定義結構並對其進行適當處理的函數,但是我想知道是否有一種方法可以告訴該結構直接輸出四個單獨的值。 這將主要用於與DirectX庫進行交互。
我確定這是基本知識,但是我一直在研究c ++的許多不同領域,因此很難記住所有內容。 我已經搜索了一段時間了,但是我不確定應該搜索什么。 我的Google技術使我失望!
提前致謝。
似乎人們對我的要求感到困惑,我將在此處嘗試簡化它:
是否有一種方法需要2個整數和2個字符來接受包含這些值而不是四個單獨值的單個結構?
我希望這可以澄清我的問題。
包裝第三方庫:
namespace david {
void need_2xcha_2xint(const Value_Holder& value) {
::need_2xcha_2xint(value.a, value.b, value.x, value.y);
}
}
使用它:
int main() {
Value_Holder value;
using david::need_2xcha_2xint;
need_2xcha_2xint(value);
return 0;
}
編輯
我很確定您可以使用模板和函數指針對此進行封裝。
告訴結構直接輸出四個單獨值的方法
如果您將輸出表示為std::ostream
輸出(例如std::cout
),則為Value_Holder添加流運算符...
std::ostream& operator<<(std::ostream& os, const Value_Holder& v)
{
return os << "{ a " << v.a << ", b " << b.b << ", x " << x << ", y " << y << " }";
}
然后,您可以使用以下命令簡潔地打印它:
Value_Holder v;
...
std::cout << "whatever " << v << " some more\n";
我認為fuchsgeist提供的答案是最好的方法。 如果我理解正確,那么您需要將4個參數傳遞給您的庫函數。 我希望下面的代碼能解決您的問題。
Value_Holder vh;
need_2xcha_2xint(vh.a,vh.b,vh.x,vh.y);
希望我能正確理解您的問題。
確定,在您進行編輯后,我收到了您的問題。 您可以在此處使用函數重載概念。 重載庫函數以接受您的結構。這將解決您的問題嗎?
我知道這不是一個很好的決定,您應該避免任何定義,但是無論如何,您可以嘗試以下操作:
void f(int i, char c)
{
std::cout << i << " : " << c;
}
struct s
{
int i;
char c;
};
#define S_CALL(f, s) (f(s.i, s.c))
int main(int argc, char* argv[])
{
s param;
param.i = 1;
param.c = 'a';
f(param.i, param.c);
S_CALL(f, param);
return 0;
}
當然,將這個函數包裝在自己的容器中也不遠。
是否有一種方法需要2個整數和2個字符來接受包含這些值而不是四個單獨值的單個結構?
不,沒有。
您可以使用預處理器嘗試不同的技巧,但這是一種錯誤且死胡同的方法。
您為什么不只使用結構? 盡可能經常遵循KISS原則 。
需要將幾個參數傳遞給函數會得出結論,即需要一個下層對象。 在您的情況下,您創建了結構。
但是不要忘了“ 單一職責原則” ,它需要考慮類的職責: 類應該保持簡單明了 ,而不僅僅是一堆有時不相關的參數。
在您的情況下,我不確定,但是每當我看到(int x,int y)時,我想知道是否是Point類或Vector 類 ,或Size類是否處於危險之中。 如果是這樣,我將只封裝成對的int x,int y到有關的新類中。
對於此類問題,我建議Martin Fowler着書“重構:改進現有代碼的設計” 。 他列出了修改方法,將代碼整理成更易於維護,可修改的狀態,以及何時/為什么重構代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.