こんばんわ
宣言関連で質問です。
条件によっては宣言を使い分ける事ができるようにしたいのです。
例えば、以下のようにです。どのようにすれば良いのでしょうか?
----
i>5の時{
kをint型で宣言
}
i>5以外の時{
kをlong型で宣言
}
変数のkを含む式
----
ブロック内で宣言した変数はブロック内でのみ有効ですから,
基本的にそのようなことはできません。
変数kを含む式をtemplate関数にしてしまってはどうでしょうか。
これを見る限り、iの値に関わらず、kをlongで定義してもいいような気がするのですが。
i>5の時、kはintでなければ都合が悪いのですか?
sugarさんへ
実際に組み込むのは構造体、DLLロードも含む複雑なものです。
これは、質問する内容としてこれをあげただけです。
実際は
DLL1がシステムフォルダに存在する時、
DLL1がサポートしている構造体を利用。
DLL1がシステムフォルダに存在しない時、
DLL2がシステムフォルダに存在するか確認。
DLL2が存在するのならば、DLL2がサポートしている構造体を利用。
(DLL1とDLL2がサポートしている構造体の名前は異なります。)
kを含む式の部分は、
構造体がサポートしているメンバ関数を意味します(DLL1もDLL2も共通)。
ということになります。
DLL1とDLL2がサポートしている構造体の中身ですが、
DLL1の方はDLL2がサポートしている構造体にいくつかのメンバを付け加えている形です。
YuOさん、このような条件で例としてあげた「kを含む式」をtemplate関数にしてしまうことはできるのでしょうか?
構造体のメンバの名前が同じであれば,ある程度は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);
}
こんな感じで。
> 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 に置き換えて抽象クラスを
使えば動くとは思いますが。