使用带有单例的模板的 C++

c++ using templates with a singleton

本文关键字:C++ 单例      更新时间:2023-10-16

是否可以将模板与以下单例类一起使用,以便能够将 Portit 函数与任何数据类型一起使用,而不仅仅是 int? 这是一个非常愚蠢的想法吗?

class porter
{
private:
    static porter* instance;
    porter(){}
    ~porter(){}
public:
    static porter* getInstance()
    {
        if(!instance) 
            instance = new porter();
        return instance;
    }
    void portit(int theArray[])
    {
        //sort array someway
    }
};
porter* porter::instance=NULL;

单例是不好的,但至少你可以使用更简单的实现:

class porter {
public:
    static porter& instance() { static porter P; return P; }
   template <typename T, size_t N>
    void portit(T (&array)[N]) {
        std::sort(array, array + N);
    }
private:
    porter() = default;
    ~porter() = default;
};
// usage
porter::instance().portit(somearray);

当然,使用这样的单例是没有意义的。比较编写和使用时间与更好的实现:

template <typename T, size_t N>
void sort(T (&array)[N]) { std::sort(array, array + N); }
// usage
sort(somearray);

您可以使用函数模板

类似的东西

...
template <typename T>
void portit(T theArray[])
{
    //sort array someway
}
...

所以像...

template <typename T>
class porter<T> {
     public:
           template <typename T>
           static porter<T> * getInstance() {
           }
     private:
           static porter<T> * instance;
}

???注意:这可能无法编译。自从我涉足模板以来已经有一段时间了。

这绝对是可能的,但在我看来,在开始编码之前,你应该真正考虑整个事情的设计,特别是如果你想在类中有另一种模板类型。

至于你是要每个类一个单例,还是所有实例一个单例......嗯,这有点复杂。