C++ 是否可以在编译时限制类的实例数?

C++ 是否可以在编译时限制类的实例数?,c++,class,compiler-errors,object-construction,C++,Class,Compiler Errors,Object Construction,假设有一个类Foo,作为库的设计者,我不希望我的用户能够实例化超过n的次数(其中n不一定是1)。 在编译过程中,有没有办法执行此规则 请注意,我不是在追求单一模式或类似模式,因为我希望用户在执行代码之前意识到他们不应该实例化类 到目前为止,我最好的尝试是将静态断言和\u计数器宏结合起来,但没有效果,因为它们似乎没有像我预期的那样在函数或类内部进行评估 constexpr int bar() { static_assert( __COUNTER__ < 5, "You called

假设有一个类
Foo
,作为库的设计者,我不希望我的用户能够实例化超过
n
的次数(其中
n
不一定是
1
)。 在编译过程中,有没有办法执行此规则

请注意,我不是在追求单一模式或类似模式,因为我希望用户在执行代码之前意识到他们不应该实例化类

到目前为止,我最好的尝试是将
静态断言
\u计数器
宏结合起来,但没有效果,因为它们似乎没有像我预期的那样在函数或类内部进行评估

constexpr int bar()
{
    static_assert( __COUNTER__ < 5, "You called this too many times!");
    return 0;
}
constexpr int bar()
{
static_assert(uu COUNTER_uu<5,“您调用这个太多次了!”);
返回0;
}

否。即使撇开生成单个实例的单个函数可能被多次调用,或者实例化可能发生在循环或模板中这一事实不谈,也没有什么可以阻止实例化发生在另一个翻译单元中。

这种检查不能在编译时进行,只能在运行时进行。如果您不想使用单例,请将计数器设为类的静态成员,在构造函数中递增计数器,并在超出计数器后让构造函数抛出异常。是的,我恐怕正如您所说的。。。这有点令人失望,因为查看
static\u assert
\u COUNTER\u
似乎可以找到此类解决方案的构建块。