質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.61%

  • C++

    3348questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

[C++] < >内の引数は整数のみ?

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 4
  • VIEW 1,167

ikuwow

score 431

C++の素人ですが、必要に迫られてC++のとあるライブラリを編集しようとしています。その中に以下のようなソースが大量に書かれていて絶望しました。このライブラリを信用するかどうか迷っています。

C++の基本文法すらよく知らないのですが、コレってクソコードですよね・・・・? それとも< >の中には変数は使えないなんていう仕様があるんですか・・・・・・?

(大変長いコードで恐縮です)

if      (p->patch_w == 1) { nn_n<1,1,1>(p, a, b, ann, annd, amask, bmask, level, em_iter, rp, offset_iter, update_type, region_masks, tiles, ann_window, awinsize); }
      else if (p->patch_w == 2) { nn_n<2,1,1>(p, a, b, ann, annd, amask, bmask, level, em_iter, rp, offset_iter, update_type, region_masks, tiles, ann_window, awinsize); }
      else if (p->patch_w == 3) { nn_n<3,1,1>(p, a, b, ann, annd, amask, bmask, level, em_iter, rp, offset_iter, update_type, region_masks, tiles, ann_window, awinsize); }
      else if (p->patch_w == 4) { nn_n<4,1,1>(p, a, b, ann, annd, amask, bmask, level, em_iter, rp, offset_iter, update_type, region_masks, tiles, ann_window, awinsize); }
      else if (p->patch_w == 5) { nn_n<5,1,1>(p, a, b, ann, annd, amask, bmask, level, em_iter, rp, offset_iter, update_type, region_masks, tiles, ann_window, awinsize); }
      else if (p->patch_w == 6) { nn_n<6,1,1>(p, a, b, ann, annd, amask, bmask, level, em_iter, rp, offset_iter, update_type, region_masks, tiles, ann_window, awinsize); }
      else if (p->patch_w == 7) { nn_n<7,1,1>(p, a, b, ann, annd, amask, bmask, level, em_iter, rp, offset_iter, update_type, region_masks, tiles, ann_window, awinsize); }
      else if (p->patch_w == 8) { nn_n<8,1,1>(p, a, b, ann, annd, amask, bmask, level, em_iter, rp, offset_iter, update_type, region_masks, tiles, ann_window, awinsize); }
      else if (p->patch_w == 9) { nn_n<9,1,1>(p, a, b, ann, annd, amask, bmask, level, em_iter, rp, offset_iter, update_type, region_masks, tiles, ann_window, awinsize); }
      else if (p->patch_w == 10) { nn_n<10,1,1>(p, a, b, ann, annd, amask, bmask, level, em_iter, rp, offset_iter, update_type, region_masks, tiles, ann_window, awinsize); }
      else if (p->patch_w == 11) { nn_n<11,1,1>(p, a, b, ann, annd, amask, bmask, level, em_iter, rp, offset_iter, update_type, region_masks, tiles, ann_window, awinsize); }
      else if (p->patch_w == 12) { nn_n<12,1,1>(p, a, b, ann, annd, amask, bmask, level, em_iter, rp, offset_iter, update_type, region_masks, tiles, ann_window, awinsize); }
      else if (p->patch_w == 13) { nn_n<13,1,1>(p, a, b, ann, annd, amask, bmask, level, em_iter, rp, offset_iter, update_type, region_masks, tiles, ann_window, awinsize); }
      else if (p->patch_w == 14) { nn_n<14,1,1>(p, a, b, ann, annd, amask, bmask, level, em_iter, rp, offset_iter, update_type, region_masks, tiles, ann_window, awinsize); }
      else if (p->patch_w == 15) { nn_n<15,1,1>(p, a, b, ann, annd, amask, bmask, level, em_iter, rp, offset_iter, update_type, region_masks, tiles, ann_window, awinsize); }
      else if (p->patch_w == 16) { nn_n<16,1,1>(p, a, b, ann, annd, amask, bmask, level, em_iter, rp, offset_iter, update_type, region_masks, tiles, ann_window, awinsize); }
      else if (p->patch_w == 17) { nn_n<17,1,1>(p, a, b, ann, annd, amask, bmask, level, em_iter, rp, offset_iter, update_type, region_masks, tiles, ann_window, awinsize); }
      else if (p->patch_w == 18) { nn_n<18,1,1>(p, a, b, ann, annd, amask, bmask, level, em_iter, rp, offset_iter, update_type, region_masks, tiles, ann_window, awinsize); }
      else if (p->patch_w == 19) { nn_n<19,1,1>(p, a, b, ann, annd, amask, bmask, level, em_iter, rp, offset_iter, update_type, region_masks, tiles, ann_window, awinsize); }
      else if (p->patch_w == 20) { nn_n<20,1,1>(p, a, b, ann, annd, amask, bmask, level, em_iter, rp, offset_iter, update_type, region_masks, tiles, ann_window, awinsize); }
      else if (p->patch_w == 21) { nn_n<21,1,1>(p, a, b, ann, annd, amask, bmask, level, em_iter, rp, offset_iter, update_type, region_masks, tiles, ann_window, awinsize); }
      else if (p->patch_w == 22) { nn_n<22,1,1>(p, a, b, ann, annd, amask, bmask, level, em_iter, rp, offset_iter, update_type, region_masks, tiles, ann_window, awinsize); }
      else if (p->patch_w == 23) { nn_n<23,1,1>(p, a, b, ann, annd, amask, bmask, level, em_iter, rp, offset_iter, update_type, region_masks, tiles, ann_window, awinsize); }
      else if (p->patch_w == 24) { nn_n<24,1,1>(p, a, b, ann, annd, amask, bmask, level, em_iter, rp, offset_iter, update_type, region_masks, tiles, ann_window, awinsize); }
      else if (p->patch_w == 25) { nn_n<25,1,1>(p, a, b, ann, annd, amask, bmask, level, em_iter, rp, offset_iter, update_type, region_masks, tiles, ann_window, awinsize); }
      else if (p->patch_w == 26) { nn_n<26,1,1>(p, a, b, ann, annd, amask, bmask, level, em_iter, rp, offset_iter, update_type, region_masks, tiles, ann_window, awinsize); }
      else if (p->patch_w == 27) { nn_n<27,1,1>(p, a, b, ann, annd, amask, bmask, level, em_iter, rp, offset_iter, update_type, region_masks, tiles, ann_window, awinsize); }
      else if (p->patch_w == 28) { nn_n<28,1,1>(p, a, b, ann, annd, amask, bmask, level, em_iter, rp, offset_iter, update_type, region_masks, tiles, ann_window, awinsize); }
      else if (p->patch_w == 29) { nn_n<29,1,1>(p, a, b, ann, annd, amask, bmask, level, em_iter, rp, offset_iter, update_type, region_masks, tiles, ann_window, awinsize); }
      else if (p->patch_w == 30) { nn_n<30,1,1>(p, a, b, ann, annd, amask, bmask, level, em_iter, rp, offset_iter, update_type, region_masks, tiles, ann_window, awinsize); }
      else if (p->patch_w == 31) { nn_n<31,1,1>(p, a, b, ann, annd, amask, bmask, level, em_iter, rp, offset_iter, update_type, region_masks, tiles, ann_window, awinsize); }
      else if (p->patch_w == 32) { nn_n<32,1,1>(p, a, b, ann, annd, amask, bmask, level, em_iter, rp, offset_iter, update_type, region_masks, tiles, ann_window, awinsize); }
      else { fprintf(stderr, "Patch size unsupported: %d\n", p->patch_w); exit(1); }
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+5

「< >の中には変数は使えないなんていう仕様」はあります。
テンプレートの引数(< >の中)は静的に決まる値しか使えません。静的に決まるというのは、型や定数のようにコンパイル時に決まる値です。
理由はテンプレートがコンパイル時に指定された引数を使って展開するものだからです。

ただ、nn_n の関数中身を見てないので、はっきりしたことは言えませんが、ここで大量の条件分岐するぐらいなら、テンプレートを使わず、もっといい書き方はあったんじゃないかという気はします。


また、それ以外にも
  • if else より switch がいい(見やすさや速度の面で)
  • マジックナンバー(数字)や文字列リソースが直書きされてる
  • 関数の引数が多すぎ
などなど、ツッコミどころはあります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2014/10/14 13:52

    なるほど、そういう仕様なのですね。高速性が求められる処理なのでtemplateを使っているのだとは思いましたが、こう汚いと他に手はなかったのかと気になってきます。引数が多すぎる点は、画像処理で実験用のライブラリでパラメータを変えながら実験する必要があるからこうなったのだと思います。ありがとうございました。

    キャンセル

+1

C++には実行の前にコンパイルという作業が入ります。
これはテンプレートという機能を使っていて、実行時ではなくコンパイル時に計算を済ませるためのものです。こうすることによって、実行時に余計な計算をする必要がなくなり、速度が速くなります。
詳しくはテンプレートメタプログラミングというキーワードで検索してみてください。
ご質問のライブラリは、どうやら画像処理かなにかのようで、速度が重要なものではないでしょうか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2014/10/14 13:50

    仰るとおり画像処理で高速性を謳っているアルゴリズムです。なるほど、コンパイル前に計算を済ませてしまっているのですね。回答ありがとうございます。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • C++

    3348questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。