宣言関連

[戻る]
将吉 2002/06/25(火) 03:55:56
こんばんわ

宣言関連で質問です。

条件によっては宣言を使い分ける事ができるようにしたいのです。
例えば、以下のようにです。どのようにすれば良いのでしょうか?
----
i>5の時{
 kをint型で宣言
}
i>5以外の時{
  kをlong型で宣言
}

変数のkを含む式
----

YuO [E-Mail] 2002/06/25(火) 05:23:55
ブロック内で宣言した変数はブロック内でのみ有効ですから,
基本的にそのようなことはできません。

変数kを含む式をtemplate関数にしてしまってはどうでしょうか。

sugar 2002/06/25(火) 09:25:03
これを見る限り、iの値に関わらず、kをlongで定義してもいいような気がするのですが。
i>5の時、kはintでなければ都合が悪いのですか?

将吉 2002/06/25(火) 09:43:51
sugarさんへ
実際に組み込むのは構造体、DLLロードも含む複雑なものです。
これは、質問する内容としてこれをあげただけです。

実際は
DLL1がシステムフォルダに存在する時、
DLL1がサポートしている構造体を利用。
DLL1がシステムフォルダに存在しない時、
DLL2がシステムフォルダに存在するか確認。
DLL2が存在するのならば、DLL2がサポートしている構造体を利用。
(DLL1とDLL2がサポートしている構造体の名前は異なります。)

kを含む式の部分は、
構造体がサポートしているメンバ関数を意味します(DLL1もDLL2も共通)。

ということになります。

DLL1とDLL2がサポートしている構造体の中身ですが、
DLL1の方はDLL2がサポートしている構造体にいくつかのメンバを付け加えている形です。

YuOさん、このような条件で例としてあげた「kを含む式」をtemplate関数にしてしまうことはできるのでしょうか?

YuO [E-Mail] 2002/06/25(火) 10:23:06
構造体のメンバの名前が同じであれば,ある程度はtemplateにできます。
ただし,DLL1側の構造体独自のメンバに関しては,別途処理する必要があります。

template <typename T> void RegWnd (T & wc)
{
    memset(&wc, sizeof(T), 0);
    wc.style = CS_HREDRAW | CS_VREDRAW;
// ...
}

if (foo_expression) {
    WNDCLASS wc;
    RegWnd(wc);
    return RegisterClass(&wc);
} else {
    WNDCLASSEX wc;
    RegWnd(wc);
    wc.hIconSm = static_cast<HICON>(LoadImage……);
    wc.cbSize = sizeof(wc);
    return RegisterClassEx(&wc);
}
こんな感じで。

Joan 2002/06/25(火) 12:42:30
> i>5の時{
>  kをint型で宣言
> }
> i>5以外の時{
>   kをlong型で宣言
> }

ちょっと、動的に変数の型を変えるのは難しいかと思います。
Java や C# のように C++ では int, long などの変数を
クラス化していまえば、不可能ではないかと。

CType を抽象クラスに int のクラス CInt, long は CLong.

CType* lpType;

if ( i>5 )
{ 
  lpType = new CInt;
} else
{
  lpType = new CLong;
}

と、すれば Type がどうなっても抽象クラスで用意しておけば
平気かと。

ただし、ちょっと面倒なことに最低 operetor を定義しないと
いけないですね。基本的なオペレータをするテンプレートクラス
も派生しておくと便利かな・・。

でも、構造体とのことなので、class に置き換えて抽象クラスを
使えば動くとは思いますが。

古いスレッドには追加発言できません。