我下面的目標是讓事情在編譯時的境界儘可能的。
這是刪除一些樣板的別名。 std::integral_constant
是一個精彩std
型存儲編譯時確定的整數型:
template<std::size_t I>
using size=std::integral_constant<std::size_t, I>;
接着,index_of
類型和index_of_t
是略微更易於使用:
template<class...>struct types{using type=types;};
template<class T, class Types>struct index_of{};
template<class T, class...Ts>
struct index_of<T, types<T, Ts...>>:size<0>{};
template<class T, class T0, class...Ts>
struct index_of<T, types<T0, Ts...>>:size<
index_of<T,types<Ts...>>::value +1
>{};
此別名返回純std::integral_constant
,而不是一個類型,從它繼承:
template<class T, class...Ts>
using index_of_t = size< index_of<T, types<Ts...>>::value >;
最後,我們的功能:
template <class Component>
static constexpr index_of_t<Component, Components...>
ordinal() const {return{};}
它不僅constexpr
時,它返回其類型編碼它的值的值。size<?>
有一個constexpr operator size_t()
以及一個operator()
,所以你可以在大多數期望整數類型無縫地使用它。
您還可以使用:
template<class Component>
using ordinal = index_of_t<Component, Components...>;
現在ordinal<Component>
是表示組件的索引類型,而不是功能。
我發現[這個解決方案(http://stackoverflow.com/questions/18063451/get-index-of-a-tuple-elements-type)元組,我敢肯定,你可以適應它爲你的使用情況。 – Borgleader
看起來很有希望。 –