これで、ベクトルとその他の型にいくつかの要素をプッシュし、push_back
演算子をサポートするテンプレートを作成したいと考えています。呼び出す関数がある場合はそれを無視する
私はこの
template<typename T>
T fill(size_t n) {
T v;
//(1)
for(size_t i = 0; i < n; ++i){
v.push_back(generate_some_how());
}
return v;
}
それが動作するようにそれを行うことができます。しかし今では、(1)
の代わりにv.reserve(n);
を使用して、サポートするタイプの速度を向上させたいと考えています。しかし、私はまだコンパイルされないタイプのこのコードをコンパイルすることができるようにしたいreserve
これを達成するための簡単な方法はありますか?
私はハードコードされたタイプを特化するかもしれませんが、それは良いとは思われません。
C++ 11はOKです。
私はそれを疑っていますが、わかりません。私の推測では、テンプレートの特殊化を使用する必要があります –
あまりにも難しい....適切な署名を持つ 'reserve'メンバー関数の存在を検出する特性を書く必要があります。あなたのベルトのツールにはさまざまなアプローチがあります。 'reserve_'テンプレート関数を書いて、その特性を使って' reserve() 'やno-opを呼び出して' /(1 ) 'を使うか、ヘルパーや' fill'自体でSFINAEを使うことができます。 'fill 'のコードのほとんどが同じであるので、私はヘルパー関数を使用しようとします。 –
C++ 11を使用している場合は、適切な 'emplace'呼び出しをサポートして、' push_back'を置き換えることを検討してください。 –