c++ - 共享实例的模板
问题描述
我正在寻找一种方法来标准化和简化我经常重复用于共享对象实例的编码模式,这种模式不依赖于旧的 C 风格的宏来复制代码。
下面的示例代表了我希望能够重用和标准化的一般编码模式——例如getInstance()
,、、reset()
声明sObjectInstance
、定义等。std::shared_ptr
它还包括特定于示例ShaderOptions
类的内容(例如,采样质量支持),因为我需要一个支持特定于类的成员、枚举、函数等的解决方案。
例如,我知道我可以使用 C 宏,DECLARE_SHARED_POINTER( ShaderOptions )
但我希望找到一种更清洁、更 C++ 的方式。
#pragma once
#include "cinder/CinderAssert.h"
#include <memory>
typedef std::shared_ptr<class ShaderOptions> ShaderOptionsPtr;
class ShaderOptions
{
public:
// Sampling quality.
enum SamplingQuality
{
NORMAL,
HIGH
};
// Total sampling qualities.
static const size_t TOTAL_SAMPLING_QUALITIES = (size_t)SamplingQuality::HIGH+1;
//! Get the object instance.
static ShaderOptionsPtr getInstance()
{
if ( !sObjectInstance ) {
sObjectInstance = ShaderOptionsPtr( new ShaderOptions );
}
CI_ASSERT( sObjectInstance );
return sObjectInstance;
}
//! Reset the object instance.
static void reset() { sObjectInstance.reset(); }
//! Set the sampling quality.
void setSamplingQuality( const SamplingQuality samplingQuality ) { mSamplingQuality = samplingQuality; }
SamplingQuality getSamplingQuality() const { return mSamplingQuality; }
private:
//! Construct the shader options.
ShaderOptions() {}
//! Sampling quality.
SamplingQuality mSamplingQuality = SamplingQuality::NORMAL;
//! Shared object instance.
inline static ShaderOptionsPtr sObjectInstance;
};
解决方案
推荐阅读
- ecmascript-6 - 使用 webpack-dev-server 实时将 ES6+ 转换为 ES5
- acumos - 我可以将我的模型发布到 Acumos 市场吗?
- java - EJB 注入和 EntityManager 都为空
- spring - Spring - 无法使用 JPA 更新或插入任何值到 MySQL
- node.js - nullError: getaddrinfo ENOTFOUND ksr-ca-qmaltjira.ca.kronos.com ksr-ca-qmaltjira.ca.kronos.com:8061
- python-3.x - 编写一个递归函数 clean list(l1, l2),它将两个列表作为输入并返回 l1 中不存在于 l2 中的元素列表
- html - ngx-quill 中的空白
- php - 带有自签名证书的 MAMP 中的 file_get_contents 失败
- mongodb - 从 Google App Engine Standard 连接到 MongoDB Atlas
- r - R-如果我强制 R 停止循环,是否会应用对数据的修改?