根据派生类参数选择基类模板参数

时间:2014-02-04 22:40:38

标签: c++ templates boost template-meta-programming

我希望以下描述比较清楚:

我目前的设计有一个类似于以下的类层次结构:

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教育自己。

提前致谢,

什穆埃尔

1 个答案:

答案 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...>;
};