2

行う方が良いですか:

const int MY_CONST = 20; // global constant in the program
class A {
    // uses MY_CONST all over the class implementation and definition
}

またはこれ?

const int MY_CONST = 20; // global constant in the program
template<int my_const>
class A {
    //uses my_const only and never MY_CONST
};

//A<MY_CONST> used later in the program

これらのパターンの1つは他よりも優れていますか?なぜ?ありがとう

4

4 に答える 4

3

そのグローバル定数がクラス外の他の場所で使用されていない限り、私はこれらのアプローチのどちらも使用せず、定数を次のメンバーにしAます。

class A {
public:
    static const int MY_CONST = 20;
};

const int A::MY_CONST; // Possibly need definition also

そしてA::MY_CONST、コードで使用します。

テンプレートを使用するのは、何らかの理由でインスタンスに応じて値を変更する必要がある場合のみです。

template <int I>
class A
{
public:
    static const int MY_CONST = I;
};

template <int I>
const int A<I>::MY_CONST; // Definition

次に、次のようなインスタンスを作成します。

A<1> a1;
A<2> a2;
于 2012-09-06T20:43:06.623 に答える
2

A<MY_CONST + 1>2番目の解決策は、たとえば、、、または。A<0>以外の値をインスタンス化することが理にかなっている場合に適していますMY_CONST。ただし、A1つの値で使用するように厳密に設計されている場合は、それから何も得られません。その点で、最初のソリューションはあなたが必要とするすべてをあなたに与えます。

于 2012-09-06T20:39:27.000 に答える
0

私は常にグローバル変数を削除します。2つのケースを区別しましょう、MY_CONSTどちらかです

実装の詳細この場合、私はそれをプライベート定数にしたいです

class A
{
private:
    static int const MY_CONST = 20;
};

またはクラスインターフェイスの一部です。この場合、テンプレートパラメータにして、パブリックメンバーとして提供します。

template<int N>
class A
{
public:
    static int const MY_CONST = N;
};

このようにして、ユーザーは読み取りだけでなく、(コンパイル時に)に「書き込み」することもできますMY_CONST。ユーザーがのデフォルト値以外を指定したくない場合はN、デフォルトのテンプレート引数を指定するか、単純なtypedefを指定できます。

typedef A<20> DefaultA;
于 2012-09-06T21:43:15.143 に答える
0

それを見る1つの方法は、依存関係を導入していることですA(数値のみで、動作のあるものではありませんが、それでも一種の依存関係です)。問題は、テンプレートパラメーターを介してその依存関係を注入するかどうかです。または、名前付きconstオブジェクトを介してクラスに依存関係をプルさせます。

テンプレートがクラスのテストに役立つことがわかりAます。任意の値で機能するようにクラスを作成したいので、テストがすぐに失敗して修正する必要がないことを確信して、将来的に値を変更できます。バグ。

したがって、「実際の」プログラムがテンプレートの複数のインスタンス化を使用しない場合でも、テンプレートを作成して、さまざまな値でテストすることができます。

明らかに、動作が整数値に依存するクラスを作成してテストする方法は他にもあります。たとえば、マクロを使用してテストハーネスにコードを複数回コンパイルさせるかMY_CONST、extern値を作成して、異なる値を含む異なるオブジェクトファイルに対してコードをリンクするかA、値をデータメンバーとして保存することができます(静的データメンバー)。

どちらが機能するかは、クラスが値をどのように使用するかによって異なりますが、テンプレートパラメータは整数定数式であるため、ほとんどの用途にconst int適しています。テンプレートパラメータのアドレスを取得することはできません。すぐに頭に浮かぶのはそれだけです。

于 2012-09-06T21:34:07.013 に答える