我正在尝试初始化模板类中的数组,并将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中)?
答案 0 :(得分:9)
首先,你不能在构造函数或任何其他成员函数之外使用this
。在这里,您必须在初始化列表中初始化cl
。
将delegating constructor与std::*_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>
; clang
,你可能会在return
的{{1}}收到警告,你可以通过添加一个来消除它额外的一对括号copy_n
。