デフォルトの構築されたオブジェクトを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]
コメントを追加