gpt4 book ai didi

c++ - 如何根据 initializer_list 的大小导致编译时错误?

转载 作者:行者123 更新时间:2023-11-28 00:20:03 25 4
gpt4 key购买 nike

如果我有一个像这样的简单结构

struct Point { int x, y; };

那我可以做

int main()
{
Point p1 = { 10 }; // x = 10, y = 0
Point p2 = { 10, 20 }; // x = 10, y = 20
Point p3 = { 10, 20, 30 }; // Compile error: too many initializers for ‘Point’
return 0;
}

我现在希望在初始化 Point 时具有相同的行为,其中 Point 成为一个类,但 xy 成为私有(private)的并使用访问器等。

我的第一次尝试是

class Point
{
public:
Point( std::initializer_list<int> init )
{
switch( init.size() )
{
case 0: x = 0; y = 0; break;
case 1:
{
auto iter = init.begin();
x = *iter++; y = 0;
break;
}
case 2:
{
auto iter = init.begin();
x = *iter++; y = *iter++;
break;
}
default:
throw 0;
break;
}
}
private:
int x, y;

};

这有点管用,但将编译时错误更改为运行时错误。现在的问题是:如何使此类的行为与简单结构相同,即当初始化列表太大时导致编译时错误?

环顾四周我发现

通过阅读答案和评论,我了解了一些 constexprstatic_assert 问题,但仍然离找到我的问题的解决方案还差得很远。是否有可能在 C++11(或 C++14)中导致编译时错误?编译器肯定知道它需要的一切,而且对于想要这样做的人来说,这似乎是一件足够的事情,标准会以某种方式将其引入。

最佳答案

通过将初始化列表构造函数替换为如下所示...

Point(int x, int y) :m_x(x), m_y(y) {}

请注意,我将私有(private)变量 x 和 y 重写为 m_x 和 m_y。

现在,当您尝试使用超过 2 个参数初始化 Point 对象时,您将得到一个编译器错误,类似于当 Point 是一个结构时的错误。

关于c++ - 如何根据 initializer_list 的大小导致编译时错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27982251/

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