C ++ 11-変数を任意のstdコンテナ(vector、list、set、unordered_set)に配置する

シュロイム

デフォルトの構築されたオブジェクトをstdコンテナーに配置し、それにイテレーターを返すジェネリックコードを記述しようとしています。

挿入すると解決策は

template<typename C>
typename C::iterator insert(C& container)
{
    return container.insert(container.end(), typename C::value_type());
}

しかし、emplaceにはそのような共通のインターフェースがないため、2つのコンテナータイプに特化する必要がありました。私の最善の試み(コンパイルされなかった)は次のとおりでした:

template<typename C>
auto emplace(C& container)
    -> decltype(container.emplace_back())
{
    return container.emplace_back();
}

template<typename C>
auto emplace(C& container)
    -> decltype(container.emplace().first)
{
    return container.emplace().first;
}

これは〜をひき起こす: error: void value not ignored as it ought to be

そして、なぜ私のdecltypeが無効と推定されたのか理解できません。

-std = c ++ 11でgcc4.8.5を使用

編集:

によって複製

int main(){std :: vector v; std :: vector :: iterator iv = emplace(v);

    std::set<int> s;
    std::set<int>::iterator is = emplace(s);
    return 0;

}

編集2:

2回目の試行

template<typename C>
auto emplace(C& container)
    -> decltype(container.emplace().first)
{
    return container.emplace().first;
}

template<typename C>
auto emplace(C& container)
    -> decltype(container.emplace(container.end()))
{
    return container.emplace(container.end());
}

verctorで動作しますが、セットがあいまいです。

シュロイム

@Quentinのおかげで最終的にそれを解決しました:

// For vector, list and anything push_backable
template<typename C>
auto emplace(C& container)
    -> decltype(container.emplace_back(),container.rbegin())
{
    container.emplace_back();
    return container.rbegin();
}

// For set,unordered_set, and anything that emplace returns a pair.
template<typename C>
auto emplace(C& container)
    -> decltype(container.emplace().first)
{
    return container.emplace().first;
}

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

C ++ 11のUnicode

分類Dev

vxworksのC ++ 11

分類Dev

c ++ 11の多次元配列にコンテナstd :: array <type、size>を使用する方法は?

分類Dev

コンストラクターに引数を持つテンプレートクラスのC ++ 11 std :: vector

分類Dev

参照のstlコンテナC ++ 11

分類Dev

別の要素と追加の要素のコンテンツを使用してC ++(11)std :: vectorを初期化します

分類Dev

C ++ 11の共有変数

分類Dev

C ++ 11 std :: unordered_mapにメソッドへのポインタを格納する方法は?

分類Dev

c ++をg ++で-cから-std = c ++ 11にコンパイルする

分類Dev

C ++ 11 std :: copyinside関数

分類Dev

C ++:イテレータがあるstd :: unordered_setの要素を置き換えます

分類Dev

c ++ 11可変個引数テンプレートのコンパイルに失敗する

分類Dev

swig用のPythonとc ++ 11:c ++ 11を有効にする方法

分類Dev

std :: vector <char>のセクションをstd :: array <char、n>、c ++ 11にキャストする

分類Dev

C ++ 11unordered_setとstd :: owner_lessのようなハッシュ

分類Dev

要素をC ++ 11コンテナからコンテナの背面に移動するにはどうすればよいですか?

分類Dev

c ++ 11に任意のメソッドポインタを格納する方法は?

分類Dev

C ++-C ++ 11 std :: arrayを返します

分類Dev

C++11 searching a vector of objects

分類Dev

C ++ 11で静的変数を使用することにはペナルティがありますか

分類Dev

c ++ 11:テンプレート関数からstd :: tupleを構築する

分類Dev

C ++ 11 std :: thread vs windows CreateThread

分類Dev

std :: make_pair with c ++ 11

分類Dev

C++11 Segmentation fault with std::promise

分類Dev

unordered_set c ++で衝突をカウントする方法

分類Dev

c ++ 11可変個引数テンプレートとstd :: endl

分類Dev

c ++ 11では、std :: moveの後にmoved変数を使用する権利がないのはなぜですか?

分類Dev

c ++ 11unordered_setとハッシュ関数の構文エラー

分類Dev

複数のアイテムのコンテナループ用のc ++ 11

Related 関連記事

  1. 1

    C ++ 11のUnicode

  2. 2

    vxworksのC ++ 11

  3. 3

    c ++ 11の多次元配列にコンテナstd :: array <type、size>を使用する方法は?

  4. 4

    コンストラクターに引数を持つテンプレートクラスのC ++ 11 std :: vector

  5. 5

    参照のstlコンテナC ++ 11

  6. 6

    別の要素と追加の要素のコンテンツを使用してC ++(11)std :: vectorを初期化します

  7. 7

    C ++ 11の共有変数

  8. 8

    C ++ 11 std :: unordered_mapにメソッドへのポインタを格納する方法は?

  9. 9

    c ++をg ++で-cから-std = c ++ 11にコンパイルする

  10. 10

    C ++ 11 std :: copyinside関数

  11. 11

    C ++:イテレータがあるstd :: unordered_setの要素を置き換えます

  12. 12

    c ++ 11可変個引数テンプレートのコンパイルに失敗する

  13. 13

    swig用のPythonとc ++ 11:c ++ 11を有効にする方法

  14. 14

    std :: vector <char>のセクションをstd :: array <char、n>、c ++ 11にキャストする

  15. 15

    C ++ 11unordered_setとstd :: owner_lessのようなハッシュ

  16. 16

    要素をC ++ 11コンテナからコンテナの背面に移動するにはどうすればよいですか?

  17. 17

    c ++ 11に任意のメソッドポインタを格納する方法は?

  18. 18

    C ++-C ++ 11 std :: arrayを返します

  19. 19

    C++11 searching a vector of objects

  20. 20

    C ++ 11で静的変数を使用することにはペナルティがありますか

  21. 21

    c ++ 11:テンプレート関数からstd :: tupleを構築する

  22. 22

    C ++ 11 std :: thread vs windows CreateThread

  23. 23

    std :: make_pair with c ++ 11

  24. 24

    C++11 Segmentation fault with std::promise

  25. 25

    unordered_set c ++で衝突をカウントする方法

  26. 26

    c ++ 11可変個引数テンプレートとstd :: endl

  27. 27

    c ++ 11では、std :: moveの後にmoved変数を使用する権利がないのはなぜですか?

  28. 28

    c ++ 11unordered_setとハッシュ関数の構文エラー

  29. 29

    複数のアイテムのコンテナループ用のc ++ 11

ホットタグ

アーカイブ