c++为函数使用结构参数而不是多个参数

C++ using struct arguments for functions instead of multiple arguments?

本文关键字:参数 结构 函数 c++      更新时间:2023-10-16

有人认为使用类或结构体传递参数有什么好处吗?

Like代替

f(int,float,string)

f(Args)

式中Argsstruct, int, float, string为成员。

优点是易于创建多个默认形参,并且在添加新参数时不必更改函数签名。

明显的好处是对语义相关的数据项进行逻辑分组。

一旦你这样做了,在结构上添加一些(成员)操作来保证你的不变量。

封装提高了代码的抽象级别,这使得它更容易维护/推理。

参见得墨忒耳定律

我认为最大的优点是不必依赖于参数顺序。如果经常更改接口,依赖顺序很容易出错,而如果更改形参结构,则总是显式地将值赋给具有特定语义的成员变量。

以Direct3D11 ID3D11Device::CreateDepthStencilState函数为例:传递const D3D11_DEPTH_STENCIL_DESC *pDepthStencilDesc比请求所需的所有参数要清楚得多。

此外,考虑可修改性:在重构期间,您不需要更改此方法签名,只需要更改底层数据结构。我发现这在协同工作时特别有用,在这种情况下,有人指定接口,其他人必须实现它。

有人认为使用类或结构传递参数有什么好处吗?

是的,我认为有很多优点。

在函数上有大的参数列表会分散客户端代码的语义参数一致性,这可以在适当的structclass中更好地管理。

如果以后需要添加额外的(可能是可选的)参数,使用struct也更加灵活。

使用类/结构体中包含的一个参数还是多个参数取决于参数的含义。

结构体使用不当:

struct Foo
{
   char const* source;
   char* destination;
};

Foo strcpy(Foo foo);

结构体的良好使用:

struct Point
{
   int x;
   int y;
};

int distanceFromOrigin(Point p) { ... }
不是

int distanceFromOrigin(int x, int y) { ... }

在这里做魔鬼倡导者。这里也有缺点,主要是语义上的。首先,如果其中一些参数是通过引用传递的,另一个是通过常量引用传递的,第三个是通过const指针传递的,第四个是通过值传递的,那么将需要大量的代码。将要求您显式地为参数结构体编写move构造函数和默认构造函数,这将很快变得乏味。向该结构体中添加成员也很繁琐。

我还认为使用结构体更好:您可以避免参数类型和顺序的混乱。假设您有foo(A, B)(用于类型AB)。但是foo(b, a)仍然可以编译,这取决于隐式结构等。

这个概念也可以使用某种Context类进行推广。依靠c++ 11可变模板,您可以将"参数超集上下文"传递给子集。