1

C++ クラスでは、グローバルな bool 変数 *const_var* がコンストラクターに設定され、他の場所では変更されていません。私のクラスにはこの変数のif 条件がたくさんあります。コードを最適化するために、テンプレート es を使用したいと思います: template < bool const_var>と instance object with X< true> ()

どのようにできるのか?ありがとう

ここでは、テンプレートのない単純なクラス:

.h ファイル

class X {
public:
bool const_var;

X(bool b);
void method1();

void method2();
void method3();
};

.cpp ファイル

X::X(bool b){
const_var=b; //unchanged elsewhere
}

void X::method1(){
 ...
 if(const_var==true)
 ...
 if(const_var==false)
 ...
}

void X::method2(){
 ...
 if(const_var==true)
 ...
 if(const_var==true)
 ...
}

void X::method3(){
 ...
 if(const_var==false)
 ...
 if(const_var==true)
  ...
}
4

2 に答える 2

0

クラス定義をクラステンプレート定義に変更する必要があります。

template <bool const_var>
class X
{
public:
  X();
  void method1();
  void method2();
  void method3();
};

実装では、次のことを行います。

template <bool const_var>
X<const_var>::X() {}

template <bool const_var>
X<const_var>::method1()
{
  //...
  if (const_var)
  //...
  if (!const_var)
  //...
}

//dtto for method2 and method3

ifコンパイラによって最適化されます。

ただし、テンプレートは明示的にインスタンス化する必要があります。そうでない場合は、テンプレートを使用するすべての翻訳ユニットでテンプレートの定義を使用できる必要があります。つまり、関数本体をヘッダーファイルに移動する、次の行を.cppに追加する必要があります。

template class X<true>;
template class X<false>;

Xまた、クラステンプレートに変更するXと、はタイプではなくなることに注意してください。X<true>X<false>はタイプのみです。これは、たとえば、変数を宣言できないことを意味します。たとえば、変数X x1(true);である必要がありますX<true> x1;

于 2013-02-06T16:21:53.923 に答える
0

ここでテンプレートを適用するのが最適だとは思いません。定数ブール値に基づいて 2 つの異なるものを装うオブジェクトがあります。X を 2 つの異なるオブジェクトに分割してみませんか?

class Thing
{
   public:
       virtual ~Thing(){}
       virtual method1() = 0;
       virtual method2() = 0;
       etc...
 };

 class TrueThing : public Thing
 {
    virtual method1(){//performs true branch}
    virtual method2(){//true branch}
 }
 class FalseThing : public Thing
 {
    virtual method1(){//performs false branch}
    etc...
 }

 void main()
 {
     TrueThing true_thing;
     FalseThing false_thing;
     true_thing.method1();
     false_thing.method1();
 }
于 2013-02-06T16:26:19.387 に答える