diff --git a/src/include/xpr/pos_type.cc.h b/src/include/xpr/pos_type.cc.h index 903657c..fbe5a41 100644 --- a/src/include/xpr/pos_type.cc.h +++ b/src/include/xpr/pos_type.cc.h @@ -288,7 +288,8 @@ namespace CNORXZ static constexpr decltype(auto) mks(const PosT& pos, std::index_sequence<Is...> is) { if constexpr(is_static_pos_type<PosT>::value){ - return SFPos<pos.val(),Is...> {}; + constexpr PosT posx; + return SFPos<posx.val(),Is...> {}; } else { return mk(pos, &SFPos<0,Is...>::permutation[0]); @@ -838,12 +839,21 @@ namespace CNORXZ return std::get<I>(mP); } + template <class BPosT, class... OPosTs> + template <SizeT I> + constexpr decltype(auto) EPos<BPosT,OPosTs...>::constexprget(CSizeT<I> i) const + { + constexpr decltype(std::get<I>(mP).val()) x; + return x; + } + template <class BPosT, class... OPosTs> template <SizeT... Is> constexpr decltype(auto) EPos<BPosT,OPosTs...>::ival(std::index_sequence<Is...> is) const { if constexpr(is_static_pos_type<EPos<BPosT,OPosTs...>>::value){ - return std::index_sequence<std::get<Is>(mP).val()...>{}; + //return std::index_sequence<std::get<Is>(mP).val()...>{}; + return std::index_sequence<constexprget(CSizeT<Is>{})...>{}; } else { return Arr<SizeT,is.size()> { (BPosT::val()+std::get<Is>(mP).val())... }; diff --git a/src/include/xpr/pos_type.h b/src/include/xpr/pos_type.h index f17b9ea..7c495bf 100644 --- a/src/include/xpr/pos_type.h +++ b/src/include/xpr/pos_type.h @@ -286,6 +286,9 @@ namespace CNORXZ private: Tuple<OPosTs...> mP; + template <SizeT I> + constexpr decltype(auto) constexprget(CSizeT<I> i) const; + template <SizeT... Is> constexpr decltype(auto) ival(std::index_sequence<Is...> is) const;