1

テンプレートクラスがあります。それを foo と呼びましょう。実装では、次のものがあります。

template<class a, class b ... class x>
void foo<a, b, ..., x>::function1() { }

template<class a, class b ... class x>
void foo<a, b, ..., x>::function2() { }

これからはもっと読みやすくしたいです。THING を定義するために typedef のようなことをすることはできますか?

template<class a, class b... class x> foo<a, b, ..., x>

次に、上記の関数ヘッダーをより単純に (短く) しますか?

ありがとう!

4

2 に答える 2

2

最初の質問は、クラス テンプレートにそれだけの数のパラメーターが本当に必要かということです。もしそうなら、それらは何らかの方法で詰めることができますか?

第 2 に、すべての関数をインラインで定義するボイラープレートが実際のコードを圧倒している場合、クラス定義でそれらをインラインで定義してみませんか? はい、一般的に悪いスタイルだと考える人もいますが、それはトレードオフです。そのガイドラインの目標は、コードを読みやすくすることであり、逆の効果がある場合は無視してください。

より良いコード編成のため.ippにファイルの最後に含まれる別のファイルに実装を保持したい場合でも、それを途中に含めるように変更できます。.hpp.ipp

foo.hpp:

template <class a, class b ... class x>
class foo {
  #include "foo_impl.ipp"
};

foo_impl.ipp:

void function1() {}
void function2() {}

これらのアイデアのどちらにも魅力を感じない場合、typedef またはテンプレート エイリアスが役立つ方法はありません。これは、テンプレートの特殊化に名前を付けるためのものだからです。あなたが何をしても、まだ自由であるテンプレートパラメータはリストされていなければならず、そうでなければコンパイラはあなたが何について話しているのか分かりません。

ただし、いつでもプリプロセッサを使用できます。

#define FOOMETHOD(rettype) template<class a, class b ... class x> \
                           rettype foo<a, b, ..., x>

FOOMETHOD(void)::function1() { }
FOOMETHOD(void)::function2() { }

これを変更する方法はたくさんあります — をマクロに入れたり、::2 つのマクロに分割して rettype を渡す必要がないようにしたり、タイプごとに異なるマクロを定義したりします。場合は、そうしてください。

于 2012-12-04T22:02:52.813 に答える
0

C ++では、問題に対する直接的な解決策がないため、ここで立ち往生しています。パラメータを入力しないように関数をインラインで定義するか、すべてのタイプをポリシークラスにパックすることができます。

struct Policy1
{
    typedef int B;
    typedef double B;
    typedef Foo C;
};

template<class Policies>
void foo<Policies>::function1() { }

foo<Policy1> FooObject;

とはいえ、多くのテンプレートパラメータを使用して、デザインをダブルチェックおよびトリプルチェックすることを強くお勧めします。すべてのパラメーターは本当に互いに独立して変化する必要がありますか?もしそうなら、あなたはあなたのクラスの何百または何千ものインスタンス化で終わるかもしれません。

于 2012-12-04T22:26:04.557 に答える