這裏的一種方式的草圖要做到這一點,通過重組Mgr2
:
template<class T>
struct Leaf {
Container<T> container;
};
template<class... Ts>
struct Mgr2 : Leaf<Ts>... {
template<class T>
Container<T> &get() {
return static_cast<Leaf<T>&>(*this).container;
}
};
有重複的類型,只要Mgr2
被實例化導致編譯時錯誤。
如果我們想在除了由類型索引的整數允許重複,或索引,我們可以將索引參數添加到Leaf
:
template<std::size_t I, class T>
struct Leaf {
Container<T> container;
};
和調整Mgr2
:
template<class Seq, class...> struct Mgr2_Impl;
template<std::size_t... Is, class... Ts>
struct Mgr2_Impl<std::index_sequence<Is...>, Ts...>
: Leaf<Is, Ts>... { };
template<class... Ts>
struct Mgr2 : Mgr2_Impl<std::index_sequence_for<Ts...>, Ts...> {
private:
template<class T, std::size_t I>
Leaf<I, T>& do_get(Leaf<I, T>& leaf) { return leaf; }
template<std::size_t I, class T>
Leaf<I, T>& do_get(Leaf<I, T>& leaf) { return leaf; }
public:
template<class T>
decltype(auto) get() { return do_get<T>(*this).container; }
template<std::size_t I>
decltype(auto) get() { return do_get<I>(*this).container; }
};
如果你想保留你的原始設計,你可以使用SFINAE或標籤發送。顯示前:
template<class U>
std::enable_if_t<std::is_same<U, T>{}, Container<U>&> get(){
return _container;
}
template<class U>
std::enable_if_t<!std::is_same<U, T>{}, Container<U>&> get(){
return _tail.template get<U>();
}
如果庫支持新的C++ 14 ['GET'](http://en.cppreference.com/w/cpp/utility/tuple/get),你可以直接使用'std :: tuple'或者將它們合成到你的'Mgr2'類中。 – user657267