사람 (기침 @Barry 기침는) 팩에 인덱싱이 불가능하다고 말했다.
이것은 C++입니다. Impossible은 아직 작성하지 않았 음을 의미합니다.
template<std::size_t I> struct index_t:std::integral_constant<std::size_t, I> {
using std::integral_constant<std::size_t, I>::integral_constant;
template<std::size_t J>
constexpr index_t<I+J> operator+(index_t<J>) const { return {}; }
template<std::size_t J>
constexpr index_t<I-J> operator-(index_t<J>) const { return {}; }
template<std::size_t J>
constexpr index_t<I*J> operator*(index_t<J>) const { return {}; }
template<std::size_t J>
constexpr index_t<I/J> operator/(index_t<J>) const { return {}; }
};
template<std::size_t I>
constexpr index_t<I> index{};
template<std::size_t B>
constexpr index_t<1> exponent(index_t<B>, index_t<0>) { return {}; }
template<std::size_t B, std::size_t E>
constexpr auto exponent(index_t<B>, index_t<E>) {
return index<B> * exponent(index<B>, index<E-1>);
}
template<std::size_t N>
constexpr index_t<0> from_base(index_t<N>) { return {}; }
template<std::size_t N, std::size_t c>
constexpr index_t<c-'0'> from_base(index_t<N>, index_t<c>) { return {}; }
template<std::size_t N, std::size_t c0, std::size_t...cs>
constexpr auto from_base(index_t<N>, index_t<c0>, index_t<cs>...) {
return
from_base(index<N>, index<c0>) * exponent(index<N>, index<sizeof...(cs)>)
+ from_base(index<N>, index<cs>...)
;
}
template<char...cs>
constexpr auto operator""_idx(){
return from_base(index<10>, index<cs>...);
}
auto nth = [](auto index_in){
return [](auto&&...elems)->decltype(auto){
using std::get;
constexpr auto I= index<decltype(index_in){}>;
return get<I>(std::forward_as_tuple(decltype(elems)(elems)...));
};
};
이제 우리는 얻을 :
using pair_vec = std::vector<std::pair<std::size_t, std::size_t>>;
template <typename... Args>
pair_vec foo(Args &&... args) {
return
index_over< sizeof...(args)/2 >()
([&](auto...Is)->pair_vec{
return {
{
nth(Is*2_idx)(decltype(args)(args)...),
nth(Is*2_idx+1_idx)(decltype(args)(args)...)
}...
};
});
}
경우 시정 인덱스를 컴파일하여 우리의 매개 변수 팩에 우리는 "직접"인덱스입니다.
live example.
"* 이것을 할 수있는 간단한 방법이 있습니까? *"No. –
두 개의 인수를 사용하는 재귀 적 삽입기를 만들 수 있고 두 개의 정지 사례 특수화를 사용하여 벡터로 쌍을 push_back 할 수 있습니다. – luk32
추가 std :: index_sequence 매개 변수가있는 내부 도우미 함수로 전달할 가능성이 있습니까? –