2016-08-08 19 views
22

まさに質問の内容。std :: lock_guardの短縮形は<std::mutex> lock(m)ですか?

std::mutex someMutex; 
std::lock_guard<std::mutex> lg(someMutex); 

理想的には私が今までstd::recursive_mutexに変更したい場合は、リファクタリングを避けるために、ミューテックスの種類を推測何か:C++では、理想的には11が、あまりにも約14以降好奇心のための速記構文があります。言い換えれば

、これを行うための方法:現代のC++のすべての型推論の力のために

std::mutex someMutex; 
std::lock_guard lg(someMutex); 

それとも

auto lg = make_lock_guard(someMutex); 

を、それだけでstd::lock_guard<std::mutex>を毎回入力して行くことにひどく冗長ようです私は1つを作りたい。

+8

あなたはtypedefと考えましたか? – zneak

+0

誰がmutexを受け入れ、ロックガードを返すテンプレート関数を書くのをやめますか? – ForceBru

+2

'make_lock_guard'の実装は、コードの1行または2行でなければなりません。 – NathanOliver

答えて

22

事前C++ 17の場合:として

template<class Mutex> 
std::lock_guard<Mutex> make_lock_guard(Mutex& mutex) { 
    mutex.lock(); 
    return { mutex, std::adopt_lock }; 
} 

用途:

std::mutex someMutex; 
auto&& lg = make_lock_guard(someMutex); 

これはコピーリストの初期化も(追加の一時を作成していない事実を利用しています概念的に)。 1つのパラメータのコンストラクタはexplicitであり、コピーリストの初期化には使用できませんので、最初にミューテックスをロックしてからstd::adopt_lockコンストラクタを使用します。

戻り値は、参照の寿命に延長するlgに直接バインドされ、再びプロセス内に一時的に(概念的にさえ)作成されません。 TCの答え@、ここにあるC++ 17の方法を示唆したものに加えて

+0

新しいコピーellisionルールのため、&& unnessesaryはC++ 17にありますか? –

+2

@Viktor Sehr。 C++ 17では、コンストラクタは構築中のクラスの型を推測することができます。これらのmake_foo関数の多くは必要ないでしょう。 –

+1

だからシンプルな... - – Quentin

5

どちらも現在の答えが示唆型名の入力を避けるためにautoキーワードを使用します。それは間違っているわけではありませんが、私はtypenameを含むように私のコードを好むので、非常に控えめにautoキーワードを使用してください。私はタイプのエイリアシングを提唱するでしょう:

using MutexLockGuard = std::lock_guard<std::mutex>; 
関連する問題