所以我有一个需要两个字符和两个整数的函数:
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);
当然我可以编写另一个接受我的自定义结构并适当处理它的函数,但我想知道是否有办法告诉struct直接输出四个单独的值。这主要用于与DirectX库进行交互。
我确信这是基本的东西,但我一直在研究c ++的许多不同领域,很难记住一切。我现在已经搜索了一段时间的答案,但我不太确定我应该搜索什么。我的谷歌技能让我失望!
提前致谢。
因为看起来人们对我的问题感到困惑,所以我会在这里尝试简化它:
对于需要2个整数和2个字符的函数,是否有办法接受包含这些值而不是四个单独值的单个结构?
我希望澄清我的问题。
答案 0 :(得分:3)
包装第三方库:
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;
}
修改强>
我很确定你可以使用模板和函数指针来封装它。
答案 1 :(得分:1)
一种告诉结构直接输出四个单独值的方法
如果您的意思是输出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";
答案 2 :(得分:1)
我认为fuchsgeist提供的答案是最好的方法。如果我理解正确,那么你需要将4个参数传递给你的库函数。我希望下面的代码解决了你的问题。
Value_Holder vh;
need_2xcha_2xint(vh.a,vh.b,vh.x,vh.y);
我希望我能正确理解你的问题。
好的我在你的编辑之后得到了你的问题。您可以在此处使用函数重载概念。重载库函数以接受您的结构。这是解决您的问题的方法吗?
答案 3 :(得分:1)
我知道这不是一个很好的决定,你应该避免任何定义,但无论如何,你可以试试这个:
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;
}
当然,将此功能包装在您自己的中并不远。
答案 4 :(得分:1)
对于需要2个整数和2个字符的函数,是否有办法接受包含这些值而不是四个单独值的单个结构?
不,没有。
你可以尝试使用预处理器进行不同的技巧,但这是一种错误的死路。
为什么不用这个结构?尽可能多地关注KISS principle。
答案 5 :(得分:1)
需要将多个参数传递给函数可以得出结论:需要一个下面的对象。在您的情况下,您创建了结构。
但是不要忘记Single Responsibility Principle,这需要考虑你的课程的责任:一个类应该保持简单明了,而不仅仅是一堆有时无关的参数
在你的情况下,我不确定,但是当我看到(int x,int y)时,我想知道是类Point 还是 Vector ,或班级大小受到威胁。如果是这样的话,我只会在相关的新类中封装int x,int y对。
对于这些问题,我推荐Martin Fowler的书“重构:改进现有代码的设计”。他列出了修改方法,将代码列入更清晰,更易于维护,可修改的状态,以及何时/为何重构代码。