은 내가 훨씬 더 효율적입니다 생각, 질문의 코드에서 정말 다른 또 다른 해결책을 제안한다 (하나의 std::array
에 작성, 템플릿 인덱스 순서에 의해 얻은 믹서기)
#include <array>
#include <utility>
#include <iostream>
template <typename T, std::size_t I0>
int blenderH (double t, T const & arr, std::index_sequence<I0> const &)
{ return arr[I0]; }
template <typename T, std::size_t I0, std::size_t ... Is>
auto blenderH (double t, T const & arr,
std::index_sequence<I0, Is...> const &)
-> std::enable_if_t<0U != sizeof...(Is), int>
{ return (1-t) * blenderH(t, arr, std::index_sequence<(Is-1U)...>{})
+ t * blenderH(t, arr, std::index_sequence<Is...>{}); }
template <typename ... Args>
int blender (double t, Args ... as)
{
static constexpr auto size = sizeof...(Args);
return blenderH(t, std::array<int, size>{ { as... } },
std::make_index_sequence<size>{});
}
int main()
{ std::cout << blender(.3, 23, 42, 89) << std::endl; }
을 불행하게도이 솔루션은 C++ 14부터 (std::index_sequence
및 std::make_index_sequence
) 작동합니다.
- 편집 -
Caleth들은 말한다.
도움이 여기에 무슨 일이 일어나고 있는지의 일부 설명. 나는 두 번째 과부하의 본문에 I0
의 부족으로 혼란스러워.
나는 설명을보십시오.
std::index_sequence
값의 색인 목록이있는 BlenderH()
(두 번째 오버로드)의 순환 버전이라고합니다. 5, 6, 7 및 8이라고 말하십시오. 따라서 I0
은 5
이고 Is...
은 6, 7, 8
입니다.
우리는 인덱스 5, 6, 7
을 먼저 가지고 6, 7, 8
을 가지고 재귀 호출 을 호출해야합니다.
우리는 1 매의 값 (제 재귀 호출하므로 std::index_sequence<(Is-1U)...>
)
및 6, 7, 8
가 Is...
이다 감소 6, 7, 8
에서
실제적인 관점에서 I0
은 폐기 될 것으로 선언됩니다. Ther은 그것을 사용할 필요가 없습니다.마지막 인수의 수를 무시하는
여기
길고도 짧은 이야기, 그것은 불가능합니다. 팩은 디자인에 의해 "탐욕 스럽다". – StoryTeller
C++에서 currying을 수행하는 방법과 매우 유사 할 수 있습니다. 비틀기는 마지막 매개 변수를 끄집어 내고 당신이 그것으로하고 싶은 어떤 특별한 일을합니다. https://stackoverflow.com/questions/152005/how-can-currying-be-done-in-c – Eljay
그 번호는 어디에서 오는 것입니까? 컴파일 타임 상수로 작업 할 때만 가능합니다. – Jodocus