注入模板构造函数

时间:2014-11-06 11:30:20

标签: c++ templates constructor

我有这个模板,最终有一个非常长的,尴尬的名字:

template <class A>
struct foo {
    template <class B>
    struct bar {
        template <class L>
        struct baz {
            template <int N>
            class MyTemplate {
            public:
                MyTemplate(A a, B b);
            };
        };
    };
};

嵌套结构在实现中是有意义的(隐藏在这个玩具示例中),所以我不想改变它。现在,每次我想使用模板时,我都需要编写foo<int>::bar<float>::baz<float>::MyTemplate<5>。我知道我能做到:

template <class A, class B, class L, int N>
class MyTemplate_Shortcut : public foo<A>::bar<B>::baz<L>::MyTemplate<N> {
    // ...
};

问题是MyTemplate的构造函数现在已隐藏。不幸的是,不同的实例化可能有不同的构造函数签名,因此不可能编写一个构造函数来调用它们。我也可以这样做:

template <class A, class B, class L, int N>
struct MyTemplate_Shortcut { {
    typedef foo<A>::bar<B>::baz<L>::MyTemplate<N> MyTemplate;
};

现在我可以做MyTemplate_Shortcut<int, float, float, 5>::MyTemplate,这是更好但不太完美。是否有任何技巧,例如CRTP或类似的注入将MyTemplate的构造函数注入MyTemplate_Shortcut?我知道在C ++ 11中,有一个带模板别名的简单解决方案:

template <class A, class B, class L, int N> using MyTemplate_Shortcut =
    foo<A>::bar<B>::baz<L>::MyTemplate<N>;

请注意,我对语法并不十分肯定,因为我之前没有使用过它。是否有非C ++ 11方法可以做到这一点?

1 个答案:

答案 0 :(得分:0)

我建议使用以下解决方案,该解决方案使用typedef来快捷嵌套模板类。

...
template <class A, class B, class L, int N>
struct MyTemplate_Shortcut  {
typedef class foo<A>::bar<B>::baz<L>::MyTemplate<N> Type;
};

MyTemplate_Shortcut<int, long, float, 5>::Type instance(5, 17);