如何使用运行参数从模板实例化对象数组
How to instantiate array of objects from template with running parameter
感谢您
对以下简化示例的帮助:
template<int N>
struct Q {
struct X {
virtual int v() = 0;
};
template<int i>
struct Z : X {
virtual int v() { return i; }
};
Z<0> z1;
/* ... */
Z<N-1> zN;
X * x[N] = { &z1, /* ... */ &zN };
};
Q<4> q;
此示例的最终目标是在 q.x 中创建 N 个元素,每个元素都指向从模板创建的对象实例,该实例具有自己的参数。
#include <utility>
#include <tuple>
#include <iostream>
template <int N, typename T = std::make_index_sequence<N>>
struct Q;
template <int N, std::size_t... Is>
struct Q<N, std::index_sequence<Is...>>
{
struct X
{
virtual int v() = 0;
};
template <int i>
struct Z : X
{
virtual int v() { return i; }
};
std::tuple<Z<Is>...> z;
X * x[N] = { &std::get<Is>(z)... };
};
int main()
{
Q<4> q;
std::cout << q.x[0]->v() << std::endl;
std::cout << q.x[1]->v() << std::endl;
}
演示
您可以使用
以下内容:
namespace detail
{
template <template <int> class Z, typename Seq> struct tuple_Z;
template <template <int> class Z, std::size_t ... Is>
struct tuple_Z<Z, std::index_sequence<Is...>>
{
using type = std::tuple<Z<Is>...>;
};
template <typename X, std::size_t N, typename Tuple, std::size_t ... Is>
constexpr std::array<X*, N> make_X_Array(Tuple& t, std::index_sequence<Is...>)
{
return {{(&std::get<Is>(t))...}};
}
}
template<int N>
struct Q {
struct X {
virtual int v() = 0;
};
template<int i>
struct Z : X {
virtual int v() { return i; }
};
Q() : Xs(detail::make_X_Array<X, N>(Zs, std::make_index_sequence<N>())) {}
typename detail::tuple_Z<Z, typename std::make_index_sequence<N>>::type Zs;
std::array<X*, N> Xs =
detail::make_X_Array<X, N>(Zs, std::make_index_sequence<N>());
};
现场示例
相关文章:
- 为什么我不能引用指向实例化对象的函数的指针?
- 为什么在使用指针时不采用类成员的默认值,而不是直接实例化对象时?
- 实例化对象并调用方法,使用单行语法在 C# 或 C++ 中返回值?
- 为什么我不能更改实例化对象内部的向量?
- 为共享指针C++单独实例化对象
- 错误 C2280 / 在 std::vector 中实例化对象时复制构造函数出现问题?
- C++:我可以在 void 函数中实例化对象吗?
- 为什么当我在构造函数中创建线程时,实例化对象和对象的指针的行为不同
- 是否可以由于以下原因在堆中实例化对象
- 一类应管理其实例化对象
- 实例化对象时如何修复分段故障错误
- QML实例化C 对象.我如何访问他们的方法
- 如何在 c++ 中使用枚举参数实例化对象
- C 实例化对象,在没有指针的情况下,其他类构造函数中没有默认构造函数
- 用push_back()实例化对象时,如何将指针传递给对象的构造函数
- 我如何在C 类的内部实例化对象
- 两者之间的最佳方法是什么:实例化对象或使用指针
- 从标头中的类实例化对象
- 我能否获得一个C++编译器在编译时实例化对象
- 访问不带实例化对象的非静态成员函数