임의의 튜플의 각 요소에 대해 템플릿이나 오버로드 된 함수를 호출해야합니다. 정확히 말하면, 튜플에 지정된대로이 함수를 요소에 대해 호출해야합니다.std :: tuple의 요소에 func를 자연스러운 (반대가 아닌) 순서로 적용하기
예를 들면.
1; 2.0f;
및 NOT 2.0f; 1;
을 : 나는, Apply<Lambda, int, float>()(Lambda(), t)
처럼라고하면 얻을 것이다 약간의 구조체/기능 Apply
가 필요 튜플 std::tuple<int, float> t{1, 2.0f};
및 기능
class Lambda{
public:
template<class T>
void operator()(T arg){ std::cout << arg << "; "; }
};
있습니다.
"원시"매개 변수 팩이 함수에 전달되고 그 반대 순서로 튜플에 대해 수행하는 방법을 알고있는 경우 해결책을 알고 있음에 유의하십시오. 그러나 부분적으로 Apply
을 전문으로 다음과 같은 시도가 실패 :
template<class Func, size_t index, class ...Components>
class ForwardsApplicator{
public:
void operator()(Func func, const std::tuple<Components...>& t){
func(std::get<index>(t));
ForwardsApplicator<Func, index + 1, Components...>()(func, t);
}
};
template<class Func, class... Components>
class ForwardsApplicator < Func, sizeof...(Components), Components... > {
public:
void operator()(Func func, const std::tuple<Components...>& t){}
};
int main{
ForwardsApplicator<Lambda, 0, int, float>()(Lambda{}, std::make_tuple(1, 2.0f));
}
코드는 컴파일하지만 첫 번째 인수가 인쇄됩니다. 단지 내가 그렇게 어떻게 길이 2와 튜플에 대한, 물론,하지만 - - 나는
template<class Func, class... Components>
class ForwardsApplicator < Func, 2, Components... >{...}
와 ForwardsApplicator
전문화를 대체 할 경우, 그것은 제대로 작동 가능한 경우, 우아 - 임의의 길이의 튜플에 대해?
편집 : 답변 해 주셔서 감사합니다. 세 사람 모두 정말로 솔직하게 말하고 가능한 모든 유리한 지점에서 문제를 설명합니다.
그 대답은 제가 찾고 있던 대답입니다. 우아하고 아주 마음에 품은 디자인에 가깝습니다. 감사! – Mischa
특수 형식 템플릿 인수가 불법이라는 것이 맞습니다. 나는 OP가 VC12를 사용하고 있다고 생각합니다. VC12는 어떤 에러도 내지 않지만 좋은 것도하지 않습니다. 좋은 오류를 발행 VC14 CTP5에서 문제가 해결되었습니다. Clang (3.5.0 및 트렁크 228146)이 진단없이 코드를 컴파일하고 전문화와도 일치한다는 점은 주목할 가치가 있습니다. 이것은보고되어야합니다. – bogdan