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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C++

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

Q&A

解決済

2回答

2159閲覧

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

ikuwow

総合スコア462

C++

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

0グッド

4クリップ

投稿2014/10/13 14:10

編集2015/08/13 01:07

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

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

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

lang

1if (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); } 2 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); } 3 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); } 4 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); } 5 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); } 6 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); } 7 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); } 8 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); } 9 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); } 10 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); } 11 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); } 12 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); } 13 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); } 14 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); } 15 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); } 16 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); } 17 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); } 18 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); } 19 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); } 20 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); } 21 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); } 22 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); } 23 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); } 24 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); } 25 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); } 26 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); } 27 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); } 28 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); } 29 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); } 30 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); } 31 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); } 32 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); } 33 else { fprintf(stderr, "Patch size unsupported: %d\n", p->patch_w); exit(1); } 34

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

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

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

また、それ以外にも

  • if else より switch がいい(見やすさや速度の面で)
  • マジックナンバー(数字)や文字列リソースが直書きされてる
  • 関数の引数が多すぎ

などなど、ツッコミどころはあります。

投稿2014/10/14 04:21

yohshiy

総合スコア863

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ikuwow

2014/10/14 04:52

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

0

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

投稿2014/10/13 14:43

JohnSmith

総合スコア198

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ikuwow

2014/10/14 04:50

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問