gpt4 book ai didi

C++20:强制使用指定初始化器来模拟命名函数参数

转载 作者:行者123 更新时间:2023-12-04 01:03:05 27 4
gpt4 key购买 nike

我非常喜欢使用临时结构和指定的初始化程序来模拟我的函数的命名参数。

struct Args {
int a;
int b;
};

int f(Args a) {
return a.a + a.b;
}

int g() {
return f({.a = 1, .b = 2}); // Works! That's what I want.
return f({1, 2}); // Also works. I want to forbid this, though.
}
但是,这些结构仍然可以通过位置初始化列表进行初始化。即,您仍然可以调用 f({1, 2}) .
我想禁止这样做并强制调用者在调用点也显式地命名参数。
我如何在 C++20 中这样做?

最佳答案

最好的方法就是代码审查。告诉人们使用指定的初始化器。指定的初始化器很棒,人们喜欢使用它们。这实际上是一个社会问题,而不是技术问题。
如果你真的想轻推一下,你总是可以先加入一些真正糟糕的数据成员,就像这样:

class Args {
struct Key { explicit Key() = default; };
struct StopIt { StopIt(Key) { } };

public:
StopIt asdfjkhasdkljfhasdf = Key();

int a;
int b;
};
Args仍然是一个集合,我们只是将这个额外的前导数据成员拼写为我刚敲击键盘时出现的任何内容。它有一个默认的成员初始化器——但是该初始化器是 Args 私有(private)的。并且只有 Args知道如何构建它。
因此,用户无法†正确地为该特定成员提供初始化程序,他们必须依靠默认成员初始化程序来正确初始化它。并且由于它先行,它们必须依赖指定的初始化才能初始化任何其他成员。
而且……这样写有点傻?只是告诉人们使用指定的初始化。

†技术上,他们可以写 f({Args().asdfjkhasdkljfhasdf, 1, 2})在这种情况下,但在这一点上,这似乎是为了荒谬或恶意。

关于C++20:强制使用指定初始化器来模拟命名函数参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67521214/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com