6

struct X;それがあり、C++11 コンパイラ (gcc 4.7 など) を使用しているとします。場合に限り、いくつかのコードと属性を発行したいと思いますopt = true

template <bool opt>
struct X {
  void foo() {
    EMIT_CODE_IF(opt) {
      // optional code
    }

    // ...common code...
  }

  int optional_variable; // Emitted if and only if opt is true
};
  1. コードに関しては、ノーマルifで十分だと思います。
  2. しかし、属性に関しては、未使用のままにしておくと (いつopt = false)、コンパイラによって自動的に省略されるのでしょうか? 私は絶対にそこにいてほしくありませんopt = false
4

1 に答える 1

3

クラス テンプレートで属性を回避する方法は、メンバーが存在しない場合に空になるように特殊化された基本クラス テンプレートから派生させることです。例えば:

template <bool Present, typename T>
struct attribute {
    attribute(T const& init): attribute_(init) {}
    T attribute_;
};
template <typename T>
struct attribute<false, T> {
};

template <bool opt>
class X: attribute<opt, int> {
    ...
};

オプションのコードに関しては、条件ステートメントを使用することはできますが、多くの場合、コードはコンパイルされません。この場合、コードを適切な関数オブジェクトに分解し、必要のないときに何もしないように特化します。

于 2012-12-09T18:38:00.233 に答える