跳转至

base/include/base/singleton/singleton.hpp

Thread-safe singleton with explicit initialization. More...

Namespaces

Name
cf

Classes

Name
class cf::Singleton
Thread-safe singleton with explicit initialization.

Detailed Description

Thread-safe singleton with explicit initialization.

Author: N/A

Version: N/A

Since: N/A

Date: N/A

Provides a singleton implementation that requires explicit initialization via init() before accessing the instance. Uses std::call_once for thread-safe initialization.

Source code

#pragma once
#include <memory>
#include <mutex>
#include <stdexcept>

namespace cf {

template <typename T> class Singleton {
  public:
    template <typename... Args> static T& init(Args&&... args) {
        std::call_once(flag_, [&] { instance_.reset(new T(std::forward<Args>(args)...)); });
        return *instance_;
    }

    static T& instance() {
        if (!instance_) {
            throw std::logic_error("Singleton not initialized. Call init() first.");
        }
        return *instance_;
    }

    static void reset() { instance_.reset(); }

    Singleton(const Singleton&) = delete;
    Singleton& operator=(const Singleton&) = delete;

  protected:
    Singleton() = default;
    virtual ~Singleton() = default;

  private:
    inline static std::unique_ptr<T> instance_ = nullptr;
    inline static std::once_flag flag_;
};

} // namespace cf

Updated on 2026-03-09 at 10:14:01 +0000