1

所以我有一个需要两个字符和两个整数的函数:

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++ 的许多不同领域,很难记住所有内容。我已经搜索了一段时间的答案,但我不太确定我应该搜索什么。我的谷歌技能让我失望了!

提前致谢。

  • 编辑 -

似乎人们对我的问题感到困惑,我将在这里尝试简化它:

有没有办法让需要 2 个整数和 2 个字符的函数接受一个保存这些值而不是四个单独值的结构?

我希望这能澄清我的问题。

4

6 回答 6

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;
}

编辑

我很确定您可以使用模板和函数指针来封装它。

于 2013-01-18T08:58:06.360 回答
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";
于 2013-01-18T08:42:59.087 回答
1

我认为 fuchsgeist 提供的答案是最好的方法。如果我理解正确,那么您需要将 4 个参数传递给您的库函数。我希望下面的代码可以解决您的问题。

Value_Holder vh;
need_2xcha_2xint(vh.a,vh.b,vh.x,vh.y);

我希望我正确理解了您的问题。

好的,我在您编辑后收到了您的问题。您可以在此处使用函数重载概念。重载库函数以接受您的结构。这可以解决您的问题吗?

于 2013-01-18T08:55:52.157 回答
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;
}

当然,离把这个函数包装在你自己的里面也不远了。

于 2013-01-18T09:01:24.013 回答
1

有没有办法让需要 2 个整数和 2 个字符的函数接受一个保存这些值而不是四个单独值的结构?

不,没有。

您可以使用预处理器尝试不同的技巧,但这是一种错误且死胡同的方式。

为什么不直接使用结构?尽可能多地遵循KISS 原则。

于 2013-01-18T09:15:51.837 回答
1

需要将几个参数传递给函数导致需要下层对象的结论。在您的情况下,您创建了结构。

但是不要忘记单一职责原则,它需要考虑类的职责:类应该保持简单明了,而不仅仅是一堆有时不相关的参数。

在您的情况下,我不确定,但是当我看到 (int x, int y) 时,我想知道类 PointVector类 Size是否处于危险之中。如果是这样,我将只封装一对 int x, int y 在相关的新类中。

For such questions, I recommend the Book "Refactoring: Improving the Design of Existing Code" by Martin Fowler. He list the ways to modify, the code into a cleaner more maintainable, modifiable sate, and when/why to refactor the code.

于 2013-01-18T09:29:15.717 回答