[英]Why is there no emplace or emplace_back for std::string?
[英]c++ std::map `emplace` and `emplace_back` overloading
我的問題如下:
我有一對功能:
using my_map_t = std::map<int, double>;
using my_map_iterator_t = my_map_t::iterator;
my_map_t my_map;
...
void func1(int a, double b) {
...
my_map.emplace(a, b);
...
}
void func2(int a, double b, my_map_iterator_t hint) {
...
my_map.emplace_hint(hint, a, b)
...
}
我想避免代碼重復並盡可能快。 我發現的一種可能的解決方案是以下
template <bool has_hint>
func(int a, double b, my_map_iterator_t hint=my_map.end() /*unused if has_hint=false*/) {
...
if constexpr(has_hint)
my_map.emplace_hint(hint, a, b);
else
my_map.emplace(a, b);
...
}
但不幸的是,我在目標機器上沒有 c++17 編譯器。
我正在考慮為提示使用默認參數,這樣emplace_hint
將具有與emplace
完全相同的效果。 但是我想 map 被實現為(RB)樹,因此所需的迭代器將每次計算(可能作為“中值迭代器”)
你能給我一個優雅的出路嗎?
您可以使用常用方法進行因式分解:
template <typename F>
void func_impl(int a, double b, F emplacer)
{
// ...
emplacer(my_map, a, b);
// ...
}
void func1(int a, double b) {
func_impl(a, b, [](auto& my_map, int a, double b) { my_map.emplace(a, b); });
}
void func2(int a, double b, my_map_iterator_t hint) {
func_impl(a, b, [&hint](auto& my_map, int a, double b) { my_map.emplace_hint(a, b, hint); });
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.