我有这个模板,它的名字又长又难看:
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 或类似的注入(inject) 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 的方法来做到这一点?
最佳答案
我会提出以下解决方案,它使用 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);
关于c++ - 注入(inject)模板构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26778391/