7

템플릿 매개 변수를 함수 매개 변수로 사용하지 않고 가변 템플릿을 사용할 수 있습니까?함수 매개 변수가없는 Variadic 템플릿

#include <iostream> 
using namespace std; 

template<class First> 
void print(First first) 
{ 
    cout << 1 << endl; 
} 

template<class First, class ... Rest> 
void print(First first, Rest ...rest) 
{ 
    cout << 1 << endl; 
    print<Rest...>(rest...); 
} 

int main() 
{ 
    print<int,int,int>(1,2,3); 
} 

을하지만 사용하지 않을 때, 그것은 컴파일되지 않습니다과 모호함에 대해 불평 :

내가 그들을 사용하면 컴파일

#include <iostream> 
using namespace std; 

template<class First> 
void print() 
{ 
    cout << 1 << endl; 
} 

template<class First, class ... Rest> 
void print() 
{ 
    cout << 1 << endl; 
    print<Rest...>(); 
} 

int main() 
{ 
    print<int,int,int>(); 
} 

불행하게도 클래스 I가 템플릿 매개 변수는 인스턴스화 할 수 없으므로 (템플릿 함수 내부에서 호출되는 정적 함수가 있음) 제공하고 싶습니다. 이렇게하는 방법이 있습니까?

+1

'표준 : declval ()'. 모든'T'를위한 작품, constructible 여부. –

+4

인수가없는 버전이 작동하지 않는 이유는 : 인수가 없으면'print '과'print '모두 똑같이 좋지만'print (3)'인수는'print (3, {})'(여기서'{}'는 "아무것도"를 의미하지 않습니다). CatPusPus가 제시하는 것처럼 과부하를 사용하지 않는 것이 표준 방법입니다. 어쨌든 인수를 추론하지 않으므로 가장 간단한 솔루션입니다. –

+0

나는 대답을 게시 하겠지만 n.m. 이미 게시했습니다. – bames53

답변

20
template<class First> // 1 template parameter 
void print() 
{ 
    cout << 1 << endl; 
} 

#if 0 
template<class First, class ... Rest> // >=1 template parameters -- ambiguity! 
void print() 
{ 
    cout << 1 << endl; 
    print<Rest...>(); 
} 
#endif 

template<class First, class Second, class ... Rest> // >=2 template parameters 
void print() 
{ 
    cout << 1 << endl; 
    print<Second, Rest...>(); 
} 
+1

'cout' 라인을 반복하는 대신 가장 밑의 버전에서'print ()'을 호출하여 코드 중복을 제거 할 수 있습니다. 나는 생각한다. –

8

유형으로 지정합니다. 주어진 유형의 * 평가되지 않은 * 표현을해야하는 경우 사용할 수 있습니다

template <typename... Ts> 
struct print_impl; 

template <typename T> 
struct print_impl<T> { 
    static void run() { 
     std::cout << 1 << "\n"; 
    } 
}; 

template <typename T, typename... Ts> 
struct print_impl<T, Ts...> { 
    static void run() { 
     std::cout << 1 << "\n"; 
     print_impl<Ts...>::run(); 
    } 
}; 

template <typename... Ts> 
void print() { 
    print_impl<Ts...>::run(); 
} 

int main() { 
    print<int, int, int>(); 
    return 0; 
} 
+0

여기 복잡성은 가치가 없다고 생각합니다. n.m.의 솔루션은 훨씬 더 간단합니다. – bames53

관련 문제