暴露最直接的基础 class 模板名称
Expose the most direct base class template name
考虑以下代码:
template <class...> struct base {};
template <class... T> struct intermediate: base<void, T...> {};
template <class... T> struct derived: base<T...>, intermediate<T...> {};
using type1 = derived<int>::intermediate::base; // works
using type2 = derived<int>::base; // ambiguous
是否有一种方法可以使其毫无歧义地工作,以便 derived<int>::base
表示层次结构中最 "direct" 基数 class(在本例中为 base<int>
) .欢迎使用模板元编程。
如果合适,您可以在 derived
中添加别名,以便您可以从外部使用它们:
template <class... Ts> struct derived: base<Ts...>, intermediate<Ts...>
{
using DirectBase = base<Ts...>;
using IndirectBase = typename intermediate<Ts...>::base;
};
然后
using type1 = derived<int>::IndirectBase ;
using type2 = derived<int>::DirectBase ;
我看不出有什么办法可以消除歧义。
有 proposal for std::bases
std::direct_bases
可能有帮助,但被拒绝了。
考虑以下代码:
template <class...> struct base {};
template <class... T> struct intermediate: base<void, T...> {};
template <class... T> struct derived: base<T...>, intermediate<T...> {};
using type1 = derived<int>::intermediate::base; // works
using type2 = derived<int>::base; // ambiguous
是否有一种方法可以使其毫无歧义地工作,以便 derived<int>::base
表示层次结构中最 "direct" 基数 class(在本例中为 base<int>
) .欢迎使用模板元编程。
如果合适,您可以在 derived
中添加别名,以便您可以从外部使用它们:
template <class... Ts> struct derived: base<Ts...>, intermediate<Ts...>
{
using DirectBase = base<Ts...>;
using IndirectBase = typename intermediate<Ts...>::base;
};
然后
using type1 = derived<int>::IndirectBase ;
using type2 = derived<int>::DirectBase ;
我看不出有什么办法可以消除歧义。
有 proposal for std::bases
std::direct_bases
可能有帮助,但被拒绝了。