As you know WinRT has C++ interfaces ABI::Windows::Foundation::Collections::IIterable and ABI::Windows::Foundation::Collections::IIterable to make iteration in collections universal. This is the very good idea, but you got interfaces with templates: (see windows.foundation.collections.h):
namespace ABI { namespace Windows { namespace Foundation { namespace Collections { template <class T> struct IIterator : IIterator_impl<T> , detail::not_yet_specialized<IIterator<T>> { }; template <class T> struct IIterable : IIterable_impl<T> , detail::not_yet_specialized<IIterable<T>> { }; template <class T, bool isStruct> struct IIterator_impl : IInspectable { private: typedef typename Windows::Foundation::Internal::GetAbiType<T>::type T_abi; typedef typename Windows::Foundation::Internal::GetLogicalType<T>::type T_logical; public: typedef T T_complex; virtual /* propget */ HRESULT STDMETHODCALLTYPE get_Current(_Out_ T_abi *current) = 0; virtual /* propget */ HRESULT STDMETHODCALLTYPE get_HasCurrent(_Out_ boolean *hasCurrent) = 0; virtual HRESULT STDMETHODCALLTYPE MoveNext(_Out_ boolean *hasCurrent) = 0; virtual HRESULT STDMETHODCALLTYPE GetMany(_In_ unsigned capacity, _Out_writes_to_(capacity,*actual) T_abi *value, _Out_ unsigned *actual) = 0; }; template <class T> struct IIterable_impl : IInspectable { private: typedef typename Windows::Foundation::Internal::GetAbiType<T>::type T_abi; typedef typename Windows::Foundation::Internal::GetLogicalType<T>::type T_logical; public: typedef T T_complex; virtual HRESULT STDMETHODCALLTYPE First(_Outptr_result_maybenull_ IIterator<T_logical> **first) = 0; }; }}}}