매개 변수 집합이 다른 임의의 튜플 목록을 허용하는 가변 템플릿을 사용하여 함수를 작성할 수 있습니까? 그래서 당신은 다음과 같은 것을 갖게 될 것입니다 :중첩 된 가변 템플릿이있는 함수
template< /* some crazy variadic thing...*/ >
void func(...) {}
func(make_tuple(1,2), make_tuple("hello"));
SFINAE to the rescue! Jeffery의 대답을 조금 더 듣고 나는이 작은 발췌문을 썼다. func의 인수 목록에 튜플이 아닌 다른 유형을 넣을 수 있습니다. 컴파일 및 실행하면 템플릿 클래스가 아닌 첫 번째 유형에 도달 할 때 인쇄 체인이 끊어집니다. seq
및 gens
은 here에서 제공됩니다.
template<typename T>
int print(T& t) {
cout << t << " ";
return 0;
}
template<typename... T> void dumby(T...) {}
// so other template classes don't cause error (see bar below)
template<typename... A>
void expand(A... a) {}
template<typename... A, int... S>
void expand(tuple<A...> a, seq<S...>) {
dumby(print(get<S>(a))...);
cout << endl;
}
template<class... Types>
void func(Types...) {}
template<template<typename...> class A, class... Types, class... tup_types>
void func(A<tup_types...> a, Types... args) {
expand(a, typename gens<sizeof...(tup_types)>::type());
func(args...);
}
template<typename... A> struct bar {};
int main() {
func(make_tuple(0,1), make_tuple(2), 1, make_tuple("hello"), 0);
func(make_tuple(0,1), bar<int,int>(), make_tuple(2), 1, make_tuple("hello"), 0);
}
실용적인 사례를 찾아 사용 해봐야 만합니다.하지만 잠깐 성공하겠습니다.
무엇 유스 케이스가 될까요? 시체를 어떻게 써줄까요? – Shoe
음, C++입니다. 명백한 대답은 뻔뻔스런 예입니다 : P하지만 누군가가 정교하게 신경을 쓸 것이라고 확신합니다. – CoffeeandCode
@CoffeeandCode, 사실 불가능합니다. – Shoe