通过元编程填充模板指针数组 class
Populate an array of template pointers class via metaprogramming
基本上我想要一个指向模板 classes 的静态指针数组。一种来自或查找 table 的映射,其中索引对应于模板 class。
我会尝试用下面的代码示例更好地解释我的问题。
#include <iostream>
struct TemplateInterface
{
virtual int get() = 0;
};
template<int I>
struct TemplatedStruct : public TemplateInterface
{
int get() override { return I; }
};
// --------------------------------------------------------------------------
// Refactor this section with metaprogramming so to have classes from 1 to N
// --------------------------------------------------------------------------
static TemplatedStruct<1> one;
static TemplatedStruct<2> two;
static TemplatedStruct<3> three;
static TemplateInterface* TIArray[3] = {&one, &two, &three};
// --------------------------------------------------------------------------
int main() {
for(int i = 0; i < 3; ++i)
{
TemplateInterface* ptr = TIArray[i];
std::cout << ptr->get() << std::endl;
}
}
你可能有
template <std::size_t... Is>
std::array<TemplateInterface*, sizeof...(Is)>
makeInterfaceArray(std::index_sequence<Is...>)
{
static std::tuple<TemplatedStruct<Is>...> data{};
return {{ &std::get<Is>(data)... }};
}
template <std::size_t N>
std::array<TemplateInterface*, N> makeInterfaceArray()
{
return makeInterfaceArray(std::make_index_sequence<N>{});
}
int main() {
for (TemplateInterface* ptr : makeInterfaceArray<3>())
{
std::cout << ptr->get() << std::endl;
}
}
基本上我想要一个指向模板 classes 的静态指针数组。一种来自或查找 table 的映射,其中索引对应于模板 class。 我会尝试用下面的代码示例更好地解释我的问题。
#include <iostream>
struct TemplateInterface
{
virtual int get() = 0;
};
template<int I>
struct TemplatedStruct : public TemplateInterface
{
int get() override { return I; }
};
// --------------------------------------------------------------------------
// Refactor this section with metaprogramming so to have classes from 1 to N
// --------------------------------------------------------------------------
static TemplatedStruct<1> one;
static TemplatedStruct<2> two;
static TemplatedStruct<3> three;
static TemplateInterface* TIArray[3] = {&one, &two, &three};
// --------------------------------------------------------------------------
int main() {
for(int i = 0; i < 3; ++i)
{
TemplateInterface* ptr = TIArray[i];
std::cout << ptr->get() << std::endl;
}
}
你可能有
template <std::size_t... Is>
std::array<TemplateInterface*, sizeof...(Is)>
makeInterfaceArray(std::index_sequence<Is...>)
{
static std::tuple<TemplatedStruct<Is>...> data{};
return {{ &std::get<Is>(data)... }};
}
template <std::size_t N>
std::array<TemplateInterface*, N> makeInterfaceArray()
{
return makeInterfaceArray(std::make_index_sequence<N>{});
}
int main() {
for (TemplateInterface* ptr : makeInterfaceArray<3>())
{
std::cout << ptr->get() << std::endl;
}
}