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 回答