FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

C++11のautoを使ってISSを改造する

C++11ではautoというキーワードが加わっている。Modern Effective C++にも、autoについて一章分かけて解説してある。

Effective Modern C++ ―C++11/14プログラムを進化させる42項目

Effective Modern C++ ―C++11/14プログラムを進化させる42項目

autoを使うことによって、明らかな型推論の部分を省略して記述することができる。例えば、これまでのC++では、STLiteratorを明示的に宣言しなければならなかった。

std::vector<int>iterator it = m_vector.begin();
while (it != m_vector.end()) {
   イテレータの処理
   it++;
}

しかし、このイテレータの処理は、毎回書かなければならない割には長くて面倒だ。それに、間違えやすく、ソースコードの横方向を短かくしたいなかで、イチレータの宣言だけでこんなに苦くなってしまうのはあまり良くないと思う。

そこで、autoを使って型推論をして、イテレータを宣言してみる。以下のようになる。

auto it = m_vector.begin();
while (it != m_vector.end()) {
    イテレータの処理
    it++;
}

このauto宣言によって、itはm_vector.begin()と等価であることからイテレータであると推論され、std::vectorとして推論される。こうした方が、方の記述を明示的に書くよりもすっきりして便利だ。 という訳で、ISSイテレータを利用している部分をautoを使って書き換えてみた。

github.com

当然ならがら実際にはイテレータとして実行されるため。今回の改造で、イテレータを使っている部分は以下のような記述になった。

        for (auto it = m_hier_skip_func.begin ();
             it != m_hier_skip_func.end ();
             it++) {
            if ((*it)->first == func_symbol) {
                m_hier_func_in_skip = true;
                if ((*it)->second == InstSkip) {
                    m_hier_debug_in_skip = true;
                }
                fprintf (GetTraceHierFp(), " ...");
                break;
            }
            it++;
        }

この方が、イテレータのためにいろいろ記述しなくても良いのですっきりだ。