宣言関連 – プログラミング – Home

通知
すべてクリア

宣言関連


将吉
 将吉
(@将吉)
ゲスト
結合: 23年前
投稿: 2
Topic starter  

こんばんわ

宣言関連で質問です。

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

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


引用解決済
トピックタグ
YuO
 YuO
(@YuO)
ゲスト
結合: 24年前
投稿: 252
 

ブロック内で宣言した変数はブロック内でのみ有効ですから,
基本的にそのようなことはできません。

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


返信引用
sugar
 sugar
(@sugar)
ゲスト
結合: 24年前
投稿: 448
 

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


返信引用
将吉
 将吉
(@将吉)
ゲスト
結合: 23年前
投稿: 2
Topic starter  

sugarさんへ
実際に組み込むのは構造体、DLLロードも含む複雑なものです。
これは、質問する内容としてこれをあげただけです。

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

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

ということになります。

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

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


返信引用
YuO
 YuO
(@YuO)
ゲスト
結合: 24年前
投稿: 252
 

構造体のメンバの名前が同じであれば,ある程度は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
 Joan
(@Joan)
ゲスト
結合: 23年前
投稿: 42
 

> 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 に置き換えて抽象クラスを
使えば動くとは思いますが。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました