用'this'指针初始化std :: array

时间:2017-08-29 14:37:55

标签: c++ arrays c++11 this

我正在尝试初始化模板类中的数组,并将this指针传递给数组中的所有元素。 这就是我的课程的样子:

template<int NUM> class outer_class;

template<int N>
class inner_class {
  private:
   outer_class<N> *cl;
  public:
   inner_class(outer_class<N> *num) {
    cl = num;
   }
   void print_num() {
    cl->print_num();
   }

};

template<int NUM> class outer_class {
 private:
  int number = NUM;

  // --> here I basically want NUM times 'this' <-- 
  std::array<inner_class<NUM>, NUM> cl = { this, this, this, this }; 

 public:

  void print_num() {
    std::cout << number << std::endl;
  }

  void print() {
    cl[NUM - 1].print_num();
  }
};

int main() {
  outer_class<4> t;
  t.print();

  return 0;
}

如何将this指针传递给存储在inner_class数组中的outer_class的所有元素(在C ++ 11中)?

2 个答案:

答案 0 :(得分:9)

首先,你不能在构造函数或任何其他成员函数之外使用this。在这里,您必须在初始化列表中初始化cl

delegating constructorstd::*_sequence内容结合使用:

template<int NUM> class outer_class {
    ...

    template <std::size_t... Integers>
    outer_class(std::index_sequence<Integers...>) 
    : cl{(static_cast<void>(Integers), this)...}
    {}

public:
    outer_class(/* whatever */) : outer_class(std::make_index_sequence<NUM>{}) {}
};

附注:

  • 您的print会员功能应标记为const,因为他们不会修改您的会员。
  • cl[NUM - 1].print_num();您可能想要使用std::array::back()

答案 1 :(得分:4)

您可以使用一些辅助函数,然后使用这些函数初始化成员,例如:

template <std::size_t I, class T>
T copy(T t) { return t; }

template <class T, std::size_t... Is>
constexpr std::array<T, sizeof...(Is)> copy_n(T const& t, std::index_sequence<Is...>) {
    return {copy<Is>(t)... };
}

template <class T, std::size_t N>
constexpr std::array<T, N> copy_n(T const& t) {
    return copy_n(t, std::make_index_sequence<N>{});
}

然后在你的课堂上:

std::array<inner_class<NUM>, NUM> cl;

outer_class() : cl(copy_n<inner_class<NUM>, NUM>(this)) { }

注意:

  • [待验证] 您无法在默认成员初始值设定项中使用this,因此您需要拥有自定义构造函数;
  • 您需要明确指定inner_class<NUM>作为copy_n的第一个模板参数,因为otherwize T将被推断为outer_class<NUM>*,而且存在隐式转换outer_class<NUM>*inner_class<NUM>std::array<outer_class<NUM*>, NUM>转换为std::array<inner_class<NUM>, NUM>;
  • 如果你使用的是C ++ 11而不是14,或clang,你可能会在return的{​​{1}}收到警告,你可以通过添加一个来消除它额外的一对括号copy_n