私のC++プレイグラウンドでコンテナで遊んでいて、むしろ技術的な問題に遭遇しました。テンプレートメンバー関数と引数転送
私はコンテナのemplaceメソッドを実装しようとしています。今のところそれは既に構築された要素をとり、それをアロケータ構築メソッドに渡すべきです。
私は3つの方法、テンプレートemplaceA
およびカップルemplaceB1
,emplaceB2
で終わった。すべて意図どおりに動作します。
私の問題はemplaceA
で、Arg
は唯一T
(これは私が欲しいものです)と明示的には述べていません。 emplaceB1
の場合、emplaceB2
は2つの異なる場所でほぼ同じ実装を提供します(私はそれを欠陥と見なします)。
回避策はありますか?
template<class T, class A> class container {
public:
using allocator_traits = typename std::allocator_traits<A>;
...
template<class Arg> void emplaceA (int n, Arg&& arg){
allocator_traits::construct(allocator_, data_+n, std::forward<Arg>(arg));};
void emplaceB1(int n, const T& t){
allocator_traits::construct(allocator_, data_+n, t);};
void emplaceB2(int n, T&& t){
allocator_traits::construct(allocator_, data_+n, std::move(t));};
...
};
C++には関数のオーバーロードがあることは知っていますが、同じ名前で引数は異なる2つ(またはそれ以上)の関数を持つことができますか? –
これは非常に奇妙なemplaceの実装です – SergeyA
これは 'emplace'よりも' push_back'に似ています。これにより 'emplaceB1'と' emplaceB2'について気分が良くなるなら、['std :: vector :: push_back'](http://en.cppreference.com/w/cpp/container/vector/push_back)も来ます同じ2つの味で。 –