画像処理のプログラムを作成していますが、グローバル変数の型を
定義する箇所で、フラグの条件にて、使用するグローバル変数の型を
使い分けるというプログラムを作ろうと思っていますが、
プログラム経験が浅いためよく分かっておりません。
例えば、
flag == TRUE ならば、static unsigned char pixel[y][x]; を、
flag == FALSE ならば、static unsigned short pixel[y][x];
といった型で使い分けたいと思っております。
どうぞ宜しくお願いします。
グローバルの使用とか、余りお勧め出来ないように思いますが。
ベースクラスを作ってポリモーフィックに継承するか、
…unionですかね。
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
とか。
質問。そのflagの値が確定するのはコンパイル時ですか? 実行時ですか?
flagの値が確定するのは、実行時となります。
> 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 を使わせるとか。
ツイート | ![]() |