簡體   English   中英

c++ std::map `emplace` 和 `emplace_back` 重載

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM