別のクラスをクラステンプレートの特殊化として使用する方法

Persixty

スピンが(コンパイル時間固定の)スピン数だけロックを試行してstd::mutexから、ロックが使用可能になるまでブロックにフォールバックするハイブリッドロッククラスがあります。

簡略化:

#include <mutex>

template<unsigned SPIN_LIMIT>
class hybrid_lock {
public:
    void lock(){
        for(unsigned i(0);i<SPIN_LIMIT;++i){
            if(this->mMutex.try_lock()){
                return;        
            }
        } 
        this->mMutex.lock();
    }
    void unlock(){
        this->mMutex.unlock();
    }
private:
    std::mutex mMutex;
};

これの特別な場合でSPIN_LIMIT==0は、「プレーン」std::mutex(つまり、目に見えるスピンがない)にフォールバックします。

だから私はそれを次のことに特化しました:

template<>
class hybrid_lock<0> : public std::mutex {};

それは正常に機能しますが、クラステンプレートを別の(既存の)テンプレートに特化するための承認された方法ですか?

luk32

注:タイトルの質問ではなく、実際の質問に回答しました。

さて、今hybird_lock<0>hybird_lock<1>はまったく異なるものです。1つは派生し、もう1つはstd::mutexそれを含み/ラップします。これにより、その背後にある全体的な構成hybird_lockと意味が変わります。つまり、それらは意味的に同じではありません。これは、いくつかの予想外の結果につながる可能性があります-hybird_lock<0>他の場合にはない多くのものを継承します。

それが唯一の違いであるなら、私は専門化をまったく気にしません。ゼロケースはコンパイル時に認識されることを忘れないでください。確実に、ループ全体が完全に最適化されます。

他の重要な(または実際の)最適化があった場合、私は次のようなものを選びます:

template<>
class hybrid_lock<0> {
public:
    void lock(){
      this->mMutex.lock();
    }
    void unlock(){
      this->mMutex.unlock();
    }
private:
    std::mutex mMutex;
};

この実装は0、ほぼ完全に異なるものではなく、特別な場合になります。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

特殊化による個別の宣言と定義を持つテンプレートクラスのメソッドでstd :: enable_ifを使用する方法

分類Dev

別のクラステンプレート内で完全に特殊化されたクラスのコンストラクターを定義する方法

分類Dev

文字列を使用してテンプレートクラスの特殊化を選択します

分類Dev

クラステンプレートの部分的な特殊化とクラスメンバーの特殊化について混乱する何か

分類Dev

すべてを再実装することなく、c ++クラステンプレートの特殊化

分類Dev

クラスと関数テンプレートの特殊化

分類Dev

C ++テンプレートの特殊化に基本クラスを追加する

分類Dev

C ++テンプレートの特殊化に基本クラスを追加する

分類Dev

テンプレート化されたクラスのメンバー構造体を特殊化する方法

分類Dev

テンプレート化されたクラスのメンバー構造体を特殊化する方法

分類Dev

ベクトルのクラステンプレートを特殊化する方法は?

分類Dev

別のテンプレートクラスのネストされた名前指定子を使用してテンプレートクラスを特殊化する

分類Dev

関数テンプレート(クラステンプレートのメンバー)を明示的に特殊化すると、「部分的な特殊化は許可されていません」というエラーが発生します。なぜですか?

分類Dev

特定のタイプのテンプレートクラスメソッドを特殊化する方法は?

分類Dev

クラステンプレートの特殊化でコードの重複を回避する方法

分類Dev

最終指定子を使用してC ++クラステンプレートを特殊化する

分類Dev

クラステンプレートの特殊化を使用してエイリアステンプレートの特殊化を作成するにはどうすればよいですか?

分類Dev

std :: enable_ifと具象型を使用したテンプレートクラスの特殊化

分類Dev

テンプレートサブクラスを特殊化する方法は?

分類Dev

doubleでテンプレートクラスを特殊化する方法は?

分類Dev

テンプレートを使用したクラステンプレートの特殊化

分類Dev

クラステンプレートを使用した可変個引数テンプレートの特殊化

分類Dev

別のクラスのテンプレート演算子の特殊化

分類Dev

整数型自体で整数型のクラステンプレートを特殊化する方法は?

分類Dev

テンプレート クラス内のメソッドを特殊化する適切な方法

分類Dev

外部クラスの可変個引数テンプレートからの引数を使用して、可変個引数テンプレートの内部クラスを部分的に特殊化することは合法ですか?

分類Dev

派生テンプレートクラスの基本クラスからメソッドを特殊化します

分類Dev

派生クラスのメンバーテンプレートクラスの部分的なクラス内特殊化を実行することは合法ですか?

分類Dev

パラメータパックを使用したテンプレートクラスの特殊化

Related 関連記事

  1. 1

    特殊化による個別の宣言と定義を持つテンプレートクラスのメソッドでstd :: enable_ifを使用する方法

  2. 2

    別のクラステンプレート内で完全に特殊化されたクラスのコンストラクターを定義する方法

  3. 3

    文字列を使用してテンプレートクラスの特殊化を選択します

  4. 4

    クラステンプレートの部分的な特殊化とクラスメンバーの特殊化について混乱する何か

  5. 5

    すべてを再実装することなく、c ++クラステンプレートの特殊化

  6. 6

    クラスと関数テンプレートの特殊化

  7. 7

    C ++テンプレートの特殊化に基本クラスを追加する

  8. 8

    C ++テンプレートの特殊化に基本クラスを追加する

  9. 9

    テンプレート化されたクラスのメンバー構造体を特殊化する方法

  10. 10

    テンプレート化されたクラスのメンバー構造体を特殊化する方法

  11. 11

    ベクトルのクラステンプレートを特殊化する方法は?

  12. 12

    別のテンプレートクラスのネストされた名前指定子を使用してテンプレートクラスを特殊化する

  13. 13

    関数テンプレート(クラステンプレートのメンバー)を明示的に特殊化すると、「部分的な特殊化は許可されていません」というエラーが発生します。なぜですか?

  14. 14

    特定のタイプのテンプレートクラスメソッドを特殊化する方法は?

  15. 15

    クラステンプレートの特殊化でコードの重複を回避する方法

  16. 16

    最終指定子を使用してC ++クラステンプレートを特殊化する

  17. 17

    クラステンプレートの特殊化を使用してエイリアステンプレートの特殊化を作成するにはどうすればよいですか?

  18. 18

    std :: enable_ifと具象型を使用したテンプレートクラスの特殊化

  19. 19

    テンプレートサブクラスを特殊化する方法は?

  20. 20

    doubleでテンプレートクラスを特殊化する方法は?

  21. 21

    テンプレートを使用したクラステンプレートの特殊化

  22. 22

    クラステンプレートを使用した可変個引数テンプレートの特殊化

  23. 23

    別のクラスのテンプレート演算子の特殊化

  24. 24

    整数型自体で整数型のクラステンプレートを特殊化する方法は?

  25. 25

    テンプレート クラス内のメソッドを特殊化する適切な方法

  26. 26

    外部クラスの可変個引数テンプレートからの引数を使用して、可変個引数テンプレートの内部クラスを部分的に特殊化することは合法ですか?

  27. 27

    派生テンプレートクラスの基本クラスからメソッドを特殊化します

  28. 28

    派生クラスのメンバーテンプレートクラスの部分的なクラス内特殊化を実行することは合法ですか?

  29. 29

    パラメータパックを使用したテンプレートクラスの特殊化

ホットタグ

アーカイブ