最近我试图创建一个只能有一个实例化对象的类。在搜索维基百科时,我发现使用单例模式会有所帮助。我不喜欢它的想法,并尝试做我自己的事情。这是它的代码。
#pragma once
#include <list>
#include <functional>
namespace GEvents
{
struct mouseinfo
{
};
template<typename T>
struct Counter
{
Counter( )
{
static_assert( objects_created<2, "Multiple Instances Created" );
objects_created++;
}
static int objects_created;
};
template<typename T> int Counter<T>::objects_created(0);
class MouseHandler:Counter<MouseHandler>
{
std::list<std::function<mouseinfo(void)>> hfunc;
public:
void Monitor( )
{
}
void Stop( )
{
}
void operator +=(std::function<mouseinfo(void)> func)
{
hfunc.push_back(func);
}
void inverseListing( )
{
hfunc.reverse( );
}
/*size_type & getFunctionCount( )
{
return hfunc.size( );
}
*/
};
}
在上面的代码中,我使用Curiously recurring template pattern来解决问题。我所做的是当我在编译时创建对象时,会有一个静态变量来计算这样创建的对象的数量。如果它小于1那么它不是问题,但是如果它超过1则 static_assert 变为false,从而导致打印消息Multiple Instances Created
。但是,当我评估此表达式时,会出现以下错误:
Error C2131: expression did not evaluate to a constant
在static_assert存在的行。我可能误解了一些对象创建的概念。另外我认为静态对象在编译时没有初始化,但它们的空间只是保留。如果是这样的话,我怎样才能在编译时调用构造函数?
答案 0 :(得分:1)
此处static_assert
无法满足您的要求。请改用assert
。
{{1>} 中的条件必须为static_assert
,可承诺在编译时检查
但是,您的代码似乎必须在运行时进行检查,因此请尝试使用literal
。