を見つけ、私はそうC++のコンテナがある場合::()
私はstd::set<std::string> a, c;
...
asserter<std::string, std::set> ass(c);
for_each(a.begin(), a.end(), ass);
として使用する場合があります
template<typename T, template<typename...> class U>
class asserter
{
public:
asserter(U<T> &c) : container(c) { };
void operator()(T lhs)
{
CU_ASSERT(container.find(lhs) != container.end());
};
private:
U<T> &container;
};
のようなタイプT
の要素の型U
のコンテナで動作数子を持っているかを決定
ここでは、現在std::includes()
を無視しています。
これは、コンテナがU::find()
が定義されているコンテナの場合に効果的です。それがなければ、std::find()
にフォールバックしたいと思います。一方、std::find()
が利用可能であれば、むしろU::find()
を使用したいと思います。 C++ 11(又は17必要に応じて)で
私はU::find()
はUのために(おそらくSTLに制限)が利用可能であるかどうかを決定し、それを使用する場合、別段std::find()
を使用できますか?
さらに便利な答えは、コードが動作する理由を説明します。たとえば、私はSFINAEを採用した答えを期待していました。 'decltype(...)'部分はC++ 17のSFINAEテクニックです(このラムダ式の構文はC++ 17だと思います)。また、 'int'は' long'オーバーロードよりもその署名を優先させるために使われますか? –
'std :: set :: find'などが等価であるのに対して、' std :: find'は等価であるという心配があります。それを考慮する必要がありますか? –
@ニッキーC理論的にはそれらは異なっているが、現実世界ではそれはどれくらいの頻度であるのだろうか?私は 'set'と' map'(そしてそれらの 'multi'のいとこ)が重要なのは唯一のものだと思います。' unordered_set'と 'unordered_map'は等価を使うべきです。 –