グローバル変数を条件付きで使用するには?


ネロ  2006-01-21 03:21:32  No: 60411

画像処理のプログラムを作成していますが、グローバル変数の型を
定義する箇所で、フラグの条件にて、使用するグローバル変数の型を
使い分けるというプログラムを作ろうと思っていますが、
プログラム経験が浅いためよく分かっておりません。
例えば、
flag == TRUE ならば、static unsigned char pixel[y][x]; を、
flag == FALSE ならば、static unsigned short pixel[y][x];
といった型で使い分けたいと思っております。
どうぞ宜しくお願いします。


Ban  2006-01-21 03:57:21  No: 60412

グローバルの使用とか、余りお勧め出来ないように思いますが。

ベースクラスを作ってポリモーフィックに継承するか、
…unionですかね。


DD.  2006-01-21 04:46:03  No: 60413

template < bool > struct Select {};
template <> struct Select< true > { typedef int SELECT_TYPE; };
template <> struct Select< false > { typdef float SELECT_TYPE; };

int main()
{
  std::cout << typeid( Select< true >::SELECT_TYPE ).name() << std::endl;
  std::cout << typeid( Select< false >::SELECT_TYPE ).name() << std::endl;
}

結果:
int
float

とか。


επιστημη  2006-01-21 07:07:18  No: 60414

質問。そのflagの値が確定するのはコンパイル時ですか? 実行時ですか?


ネロ  2006-01-22 09:14:45  No: 60415

flagの値が確定するのは、実行時となります。


Ban  2006-01-22 09:49:29  No: 60416

> flagの値が確定するのは、実行時となります。
そうすると、残念ながら templateは不向きですね。

ただの「データ箱」ならやっぱりunionが有力でしょうか。

書かれていない特殊な制限/要求があって、実は上記がベストなのかも知れませんが、
・グローバルにフラグをもって、それでデータの方を切り替える
とだけ書かれると用法がちょっと....例えばイメージとして、
struct foo_interface
{
    virtual void foo() = 0;
    virtual ~foo_interface(){}
};
template<typename T, int X, int Y>
class foo : public foo_interface
{
    T  pixel_[Y][X];
public:
    virtual void foo();
};
とかみたいにしておいて、
foo<unsigned char, X, Y> や foo<unsigned short, X, Y>を用意し、
利用者側には foo_interface を使わせるとか。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加