0

次のシングルトンクラスでテンプレートを使用して、intだけでなく任意のデータ型でportit関数を使用できるようにすることは可能でしょうか?これは非常に愚かな考えですか?

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;
}

??? 注: これはコンパイルできない可能性があります。テンプレートに手を出すのは久しぶりです。

それは間違いなく可能ですが、私の意見では、コーディングを開始する前に、特にクラスに別のテンプレート タイプが必要な場合は、全体の設計について十分に検討する必要があります。

クラスごとに 1 つのシングルトンが必要なのか、それともすべてのインスタンスに対して 1 つのシングルトンが必要なのかについては、もう少し複雑です。

于 2012-04-28T20:02:05.463 に答える