2012-04-28 11 views
0

次のシングルトンクラスを持つテンプレートを使用すると、int以外の任意のデータ型でportit関数を使用できるようになりますか?これは非常にばかげた考えですか?のC++シングルトンでテンプレートを使用する

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> 
void portit(T theArray[]) 
{ 
    //sort array someway 
} 
... 
+0

それは依存します。テンプレート化されたタイプごとに1つのシングルトンが必要ですか? – Cameron

+4

シングルトンを使う - >私は同情していません。 – Puppy

+0

@Cameronこの段階では気にしませんが、理想的には同じ関数にさまざまな型の変数を送ることができるオブジェクトが1つあります。 –

答えて

1

もちろん、このようなシングルトンを使用するだけでは意味がありません。それは書いて、より良い実装に使用することですどのくらいの比較:

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

// usage 
sort(somearray); 
2

Aシングルトンが悪いですが、非常に少なくとも、あなたはシンプルな実装を使用することができますよう

何かを使用することができます

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; 
+0

私は "ハミング鳥"はサイズではなくタイプをパラメトリックにしたいと思う。そして、すべての –

+0

@stefanbachertでC++ 11を使用するには、何のヒントはありません:右申し訳ありませんが、私は何とか右の一般的なバージョンではなく、シングルトンでそれを得ました。パッチを当てました。 –

0

だから、何かのような...

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

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

???注:これはコンパイルできません。私はテンプレートを手に入れてからしばらくしています。

それは間違いなく可能ですが、あなたは、クラス内の別のテンプレート型を持つようにしたい場合は特に、コーディングを始める前に、私の意見では、あなたが本当に全部の設計上考えなければなりません。あなたは、クラスごとにシングルトン、またはすべてのインスタンスに対して1つのシングルトンをするかどうかについては

...よくそれはもう少し複雑です。

関連する問題