【发布时间】:2015-11-28 09:40:46
【问题描述】:
我有一个std::array,其中填充了所有类型的枚举。我想实现基于我的元组
关于这个。
class CompBase
{
public:
enum CompType{
INPUT,
GRAPHICS
// ( + 5-10 additional types)
};
static const std::array<CompType, 2> compTypeArr;
};
const std::array<CompBase::CompType, 2> CompBase::compTypeArr =
{
CompBase::INPUT,
CompBase::GRAPHICS
};
template<CompBase::CompType compType_e>
class CompHolder {}; // owns one component
template<CompBase::CompType compType_e>
class CompContainer {}; // references N components
class CompInterface
{
// ...
private:
std::tuple // I want to automate this,
<
CompHolder<CompBase::INPUT>,
CompHolder<CompBase::GRAPHICS>
> compHolders;
};
class CompHandler
{
// ...
private:
std::tuple // and this process, based on the predefined array
<
CompCont<CompBase::INPUT>,
CompCont<CompBase::GRAPHICS>
> compContainers;
};
据我了解,std::make_tuple 在 c++14 ref 之前甚至不是 constexpr
所以我不确定这是否可能,因为我需要一个c++11 方法。我认为数组的存在是强制性的,因为单独的枚举并不能为这样的事情提供必要的功能。
【问题讨论】:
-
用类型列表替换你的枚举怎么样?那么以后使用起来真的会更容易。恕我直言,有枚举来列出“类型”是很差的,可变参数模板就在这里。
-
它可能很差,但我得到了相当不错的功能,而且更容易实现;虽然是的,但我遇到了一些问题。我以前使用过可变参数模板,实际上我认为它们不会使事情比这更干净,或者更可扩展(如果它有效,我当然对此非常开放)。
-
既然您似乎不介意必须编写两次枚举器列表(这是您要在此处自动化的第三个副本),那么您可以保留
enum并替换array使用可变参数模板的实例化,您可以从中获得所需的自动化。这听起来像一个解决方案吗? -
否则,问题不在于
make_tuple,而在于array:它的 const 访问器仅在 C++14 中使用constexpr,所以在 C++11 中你不能获取这些数组元素并使用它们来构建类型 - 它们不会被接受为非类型模板参数。 -
@bogdan 哦,我明白了。我会研究那个方法,谢谢。
标签: c++ arrays c++11 tuples metaprogramming