0

是否可以将模板与以下单例类一起使用,以便能够将 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;
4

3 回答 3

2

单例很糟糕,但至少您可以使用更简单的实现:

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);
于 2012-04-28T19:53:09.877 回答
1

您可以使用功能模板

就像是

...
template <typename T>
void portit(T theArray[])
{
    //sort array someway
}
...
于 2012-04-28T19:47:34.337 回答
0

所以像...

template <typename T>
class porter<T> {
     public:
           template <typename T>
           static porter<T> * getInstance() {

           }
     private:
           static porter<T> * instance;
}

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

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

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

于 2012-04-28T20:02:05.463 回答