我有这个模板,最终有一个非常长的,尴尬的名字:
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方法可以做到这一点?
答案 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);