gpt4 book ai didi

c++ - 如何强制 C++ 类方法只接受少数整数文字?

转载 作者:太空狗 更新时间:2023-10-29 20:00:20 25 4
gpt4 key购买 nike

我正在重构一个目前有一个方法的类:

void resize(size_t sz)

在当前代码库中,sz 始终为 0、1、2 或 3。底层类正在从动态分配更改为 maxsize==3 的预分配数组。

如果有人试图将大小调整为 sz>3,我怎么会得到构建时错误?添加运行时检查很容易。但我宁愿获得一个更快失败的编译时检查。

我不想更改任何使用越界整数文字进行调用的现有代码,例如:

x.resize(2)

仍应按原样编译。

但是如果有人出现并尝试

x.resize(4)
or
x.resize(n)

它应该无法编译或链接。

我在考虑一个专门针对 int 的模板,它对 {0,1,2,3} 以外的任何东西都没有定义。但我不太确定如何让它在标准 c++ 的范围内做我想做的事。

编辑:

我应该详细说明我使用模板的想法。我非常愿意更改调整大小函数的声明。我不愿意更改调用代码。

例如我在想类似的事情

void resize( ConstructedFromLiteral<0,3> sz)

void resize( ConstructedFromLiteral<0> sz)
void resize( ConstructedFromLiteral<1> sz)
void resize( ConstructedFromLiteral<2> sz)
void resize( ConstructedFromLiteral<3> sz)

最佳答案

您无法通过编译时检查运行时值。想象一下,如果你说,

resize(read_some_number_from_disk());

编译器应该如何检查?

但是,您可以将函数设为模板,因为模板参数在编译时已知:

class Foo
{
template <unsigned int N> void resize()
{
static_assert(N < 4, "Error!");
//...
}

//...

};

如果你没有静态断言,你可以装配你自己的静态断言类,它会编译失败:

template <bool> struct ecstatic_assert;  // no definition!
template <> struct ecstatic_assert<true> { } ;

用法:

... resize ... { ecstatic_assert<N < 4> ignore_me; /* ... */ } 

关于c++ - 如何强制 C++ 类方法只接受少数整数文字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7518105/

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