我将应用程序的配置存储在单例类中,如下所示(简化):
class Conf
{
Conf();
Conf(const Conf&);
Conf& operator=(const Conf&);
~Conf();
public:
static Conf& instance()
{
static Conf singleton;
return singleton;
};
static void setProperty(const std::string& name,
const std::string& value);
static std::string getProperty(const std::string& name);
private:
QMutex _mutex;
std::map<std::string, std::string> _properties;
};
Run Code Online (Sandbox Code Playgroud)
因为可以从许多线程访问配置类,所以我使用mutex进行同步:
void Conf::setProperty(const std::string& name,
const std::string& value)
{
QMutexLocker(&Conf::instance()._mutex);
Conf::instance()._properties[name]=value;
}
std::string Conf::getProperty(const std::string& name)
{
QMutexLocker(&Conf::instance()._mutex);
return Conf::instance()._properties[name];
}
Run Code Online (Sandbox Code Playgroud)
该Conf::instance()方法是否还需要锁定?
我发现了类似的问题:getter函数是否需要互斥锁?,但在我的情况下,没有setter方法(假设在线程开始之前创建单例的实例).
我试过这样的事情:
using clock = std::chrono::system_clock;
clock::time_point nowp = clock::now();
clock::time_point end = nowp + std::chrono::seconds(10);
time_t nowt = clock::to_time_t ( nowp );
time_t endt = clock::to_time_t ( end);
std::cerr << " " << ctime(&nowt) << " " << ctime(&endt) << std::endl;
Run Code Online (Sandbox Code Playgroud)
但它打印:
Sat Dec 16 15:06:43 2017
Sat Dec 16 15:06:43 2017
Run Code Online (Sandbox Code Playgroud)
我在这里做错了什么?怎么加十秒到现在?
通过这个简单的循环:
for(int i=0;i<levels;i++)
{
QImage stub(QSize(w,h),QImage::Format_RGB888);
QPainter painter(&stub);
painter.setFont(QFont("Monospace",8));
painter.setPen(Qt::magenta);
painter.drawText(stub.rect(),
Qt::AlignVCenter|Qt::AlignCenter,
QString("LAYER-%1").arg(i));
stub.save(QString("layer%1.jpg").arg(i),"JPG");
}
Run Code Online (Sandbox Code Playgroud)
我得到一个有趣的结果:

请注意图像上打印的图层编号.这看起来像一些缓冲问题.我还要提一下,这个循环不在主线程中运行.如何同步QPaitner和QImage保存?
在此视频中,https: //youtu.be/Vkck4EU2lOU?t = 582展示了“标签分发”和SFINAE作为替代方案,使您可以选择所需的模板功能。
这是对的吗?不是使用SFINAE进行“标签分配”吗?如果正确,那么SFINAE和代码分发之间到底有什么区别?