我希望以下描述比较清楚:
我目前的设计有一个类似于以下的类层次结构:
struct Base{
public:
Base(Base* child) { children.add(child);}
protected:
std::vector<Base*> children;
};
template< /* multiple typename T_n generated by Boost Preprocessor */ >
struct A : public Base{};
template <uint32_t N>
struct B : public Base{
public:
B() : Base(new A< uint32_t, uint32_t, */ additional uint32_t arguments based on parameter N */ >() ){}
};
我需要将类型为uint32_t的N + 1个参数传递给A的构造函数的问题。
如上所述,我在此类层次结构的一部分中使用了Boost预处理器。我意识到它可能是我现在问题的可能解决方案之一。但是,我的偏好是找到一种可能更好的方法(我发现Boost Preproccesor难以使用 - 绝对是由于我缺乏经验,我发现它很挑剔且代码难以阅读)。
我怀疑MPL可以在这里使用,但我看不出如何实现。
非常感谢任何建议和协助。我并不是说上面的设计是最好的设计,也可以接受如何修复的建议。话虽这么说,我仍然希望有一个基于当前设计的解决方案,至少是为了用C ++和Boost教育自己。
提前致谢,
什穆埃尔
答案 0 :(得分:2)
基本上您希望B<3>
派生自A<int, int, int>
?可以安排:
template <typename> struct BImpl; // no definition
template <typename ...Args> struct BImpl<std::tuple<Args...>> : A<Args...> {};
template <int N> using B = BImpl<typename IntMaker<N>::type>;
现在您只需创建IntMaker
,就像这样:
template <int N, typename ...Args>
struct IntMaker<N, Args...> : IntMaker<N - 1, int, Args...> {};
template <typename ...Args>
struct IntMaker<0, Args...>
{
using type = std::tuple<Args...>;
};