

C++のstd::mapのインスタンス(下記例では::table)の初期化コードをもう少し綺麗にしたいと思っています。  
お知恵をお貸しください。  
※C++17でお願いします

## 詳細

magic_enumというenumを便利に扱えるOSSを使用して、std::mapの静的インスタンス(下記例では::table)をグローバル関数(下記例では::trash::initialize)から汚らしく初期化しています。コンストラクタや初期化リストを使って綺麗に書きたいのですが、どうにも難しいので、書き方を教えてください。

型やデータは増えても構いませんし、同じ使い方が出来ればstd::mapでなくても構いません(でも出来れば依存は増やしたくないです)。

**追記**  
(他でも使えるように)::tableの要素のfirstメンバの値を生成するロジックは今後変更される可能性があり、そのときでも有用となる書き方でお願いします。

### コード

[code]

    #include <iostream>
    #include <map>
    #include <sstream>
    #include <iomanip>
    #include "magic_enum.hpp" // https://github.com/Neargye/magic_enum/releases/download/v0.8.1/magic_enum.hpp
    using namespace std;
    enum TCPSTATUS {
        UNKNOWN, ESTABLISHED, SYN_SENT, SYN_RECV, FIN_WAIT1, FIN_WAIT2, TIME_WAIT, CLOSE, CLOSE_WAIT, LAST_ACK, LISTEN, CLOSING,
    };
    map<string, TCPSTATUS> table;
    namespace trash {
        void* initialize() {
            magic_enum::enum_for_each<TCPSTATUS>([&] (auto val) {
                constexpr TCPSTATUS status = val;
                stringstream ss;
                ss << hex << uppercase << setw(2) << setfill('0') << magic_enum::enum_integer(status);
                table[ss.str()] = status;
            });
            return nullptr;
        }
        void* dummy = initialize();
    }
    int main(int argc, char* argv[]) {
        for (const auto& p: table) {
            cout << p.first << "->" << magic_enum::enum_name(p.second) << endl;
        }
        return 0;
    }
    
[/code]

## 出力(参考)

[code]

    00->UNKNOWN
    01->ESTABLISHED
    02->SYN_SENT
    03->SYN_RECV
    04->FIN_WAIT1
    05->FIN_WAIT2
    06->TIME_WAIT
    07->CLOSE
    08->CLOSE_WAIT
    09->LAST_ACK
    0A->LISTEN
    0B->CLOSING
    
[/code]


CC BY-SA 4.0
2022-10-24T00:44:33.037
91776
2022-10-24T13:11:18.387
2022-10-24T03:01:37.000
54957
54957
question
c++
std::mapの初期化を綺麗にしたい


C++17の範囲でとなると[インライン変数](https://cpprefjp.github.io/lang/cpp17/inline_variables.html)を使って

[code]

    static inline auto const table = [] {
        std::map<std::string, TCPSTATUS> table;
        for (auto e : magic_enum::enum_values<TCPSTATUS>()) {
            std::stringstream ss;
            ss << std::hex << std::uppercase << std::setw(2) << std::setfill('0') << e;
            table[ss.str()] = e;
        }
        return table;
    }();
    
[/code]

これぐらいですかね。C++20の[`std::format()`](https://cpprefjp.github.io/reference/format/format.html)を使用できれば

[code]

    static inline auto const table = [] {
        std::map<std::string, TCPSTATUS> table;
        for (auto e : magic_enum::enum_values<TCPSTATUS>())
            table[std::format("{:02X}", int(e))] = e;
        return table;
    }();
    
[/code]

もっと簡単に済ませられます。


CC BY-SA 4.0
2022-10-24T12:14:26.970
91792
2022-10-24T13:11:18.387
2022-10-24T13:11:18.387
4236
4236
91776
answer