0

「テンプレート...」ボイラープレートをより短いものに置き換えるには、どのマクロを使用できますか? すなわち: これらの代わりに:

template <typename NodeDataT, typename ArcDataT>
/*constructor*/ GraphDirected::
GraphDirected()
{
}
template <typename NodeDataT, typename ArcDataT>
/*destructor*/ GraphDirected::
~GraphDirected()
{
    clear();
}    
template <typename NodeDataT, typename ArcDataT>
void GraphDirected::
clear()
{
    nodes.clear();
    arcs.clear();
}

私はこれを書きたい:

boilerplate(/*constructor*/)
GraphDirected()
{
}
boilerplate(/*destructor*/)
~GraphDirected()
{
    clear();
}
boilerplate(void)
clear()
{
    nodes.clear();
    arcs.clear();
}

そしてもちろん最後に、他のファイルが台無しにならないように、何らかの保護 (? #undef ?) が必要になります。

それほど複雑でない場合、これらの醜さをどのように処理できますか?:

template <typename ElemType>
typename BST<ElemType>::nodeT * BST<ElemType>::
recFindNode(nodeT *t, ElemType & key) { ... }

画面サイズに応じて、Android で縦向きまたは横向きモードを強制する

過去数時間にわたっていくつかの調査と試行錯誤を行ってきましたが、この問題の完全に機能する解決策を見つけることができません. 画面サイズが十分に大きくない限り(タブレット)、Androidアプリケーションを縦向きモードに強制したいだけです。これにより、アプリが横向きモードになります。

私がこれまでに試したこと:

<activity android:screenOrientation="portrait" android:configChanges="orientation|keyboardHidden">

としても:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);

私のonCreateとonResumeで。

最初の例はある程度機能しますが、タブレットの場合、画面サイズを確認して横向きモードを強制することはできません。さらに、asynctask の実行中に携帯電話を横向きモードで保持している場合、アプリはタスクの完了後に横向きモードになり、縦向きと横向きを切り替えることができます。同じ活動。

それで、これを処理する適切な方法がわかりませんか?2 番目の例 (もう少しコードを使用すると、画面サイズを確認し、サイズに応じてレイアウトを選択できます) を使用すると、アクティビティにいる限り機能します。ただし、アクティビティを開始するときに携帯電話を横向きにすると、すべてがクラッシュします (そのため、最初はコードが効果的ではないようです)。

「バグ」なしで完全に機能する可能性のある提案は、現在の場合に非常に高く評価されます!

4

4 に答える 4

3

少数のトークンを避けるためだけに MACRO を使用することはお勧めしません。クラス テンプレートのメンバーの定義は同じファイル内に存在する必要があるため、クラス外で行う場合でも、それらを同じファイル内で定義する必要があります。

より良い解決策は、クラス自体の内部でメンバーを定義することです。これにより、メンバーを定義するたびにトークンを繰り返す必要がなくなります。

テンプレートは見苦しいエラー メッセージを生成し、MACRO は EVIL であることを思い出してください。両方を組み合わせると、何か問題が発生したときに、さらに醜く非常識なエラー メッセージが表示されます。

于 2013-01-08T17:53:38.580 に答える
0

テンプレートのボイラープレートを次のように美しくすることができれば、何も問題はないと思います。

#define pretty ugly

害がないと感じる限り。

型の場合、いつでも typedef を実行できます

于 2013-01-08T18:27:09.270 に答える
0

入力が本当に嫌いな場合は、 に置き換え、アプリケーション ドメインに標準化されたテンプレート名を使用typenameし、入力を避けるために代わりにを記述し、最終的にクラスをヘッダーのみにすることができます。classstructclasspublic:

template <class N, class A>
struct GraphDirected
{
    GraphDirected() {} // default constructor
    // rest of the class definition

private:
    // helpers and data go here
};
于 2013-01-08T18:29:07.837 に答える