2016-05-22 8 views
1

は:標準コンテナにC++汎用インサート?私は、次のプログラムがある場合

#include <vector> 
#include <set> 

template<class T, class U> 
void AddToContainer(T& container, U value) 
{ 
    container.push_back(value); 
} 

int main(char**, int) 
{ 
    std::vector<int> v; 
    AddToContainer(v, 1); 

    std::set<int> s; 
    AddToContainer(s, 1); 

    return 0; 
} 

をどのように私は、ジェネリックコンテナに追加することができますか? std::setにはpush_backがなく、insertしかないので、これはコンパイルに失敗します。

+7

これは良いアイデアのようなものですが、実際には決してそうではありません。 –

+0

STLには既に静的な多形性*がありますが、結局のところ、それは設計目標の1つです。あなたが提案しているのは、単にあなたの 'AddToContainer'のクライアントに非効率的になるよう促すことです。 – marko

答えて

4

あなたがもしpush_back()作品をチェックするためにダミーのパラメータで表現SFINAEを使用することができます:まず、push_back()は有効な式であれば

template <class C, class V> 
void AddToContainer(C& container, V&& value) { 
    append(container, std::forward<V>(value), 0); 
} 

:にあなたの関数がちょうど転送します

template <class C, class V> 
auto append(C& container, V&& value, int) 
    -> decltype(container.push_back(std::forward<V>(value)), void()) 
{ 
    container.push_back(std::forward<V>(value)); 
} 

template <class C, class V> 
void append(C& container, V&& value, ...) 
{ 
    container.insert(std::forward<V>(value)); 
} 

int0の方が良い一致です。...よりも良い一致であるため、push_back()が有効な式ではない場合、1つのviabl e過負荷。


これは実際には良いアイデアかどうかは別の質問です。

+0

どちらの場合でもinsert-with -end()を使うことができます。 –

+0

@ T.C。ヒントが悪い場合、 'std :: set'の意味はどういう意味ですか? – Barry

+0

少し効率が悪いです。それはヒントなしの挿入と同じ複雑さですが、あなたはおそらく余分な比較を支払うでしょう。 –

関連する問題