首页 > 解决方案 > 共享实例的模板

问题描述

我正在寻找一种方法来标准化和简化我经常重复用于共享对象实例的编码模式,这种模式不依赖于旧的 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;
};

请注意,我的问题与thisthis类似,但我觉得这个问题没有得到完全回答。

标签: c++templatescoding-stylec-preprocessor

解决方案


推荐阅读