다음을 수행 할 수 있다는 것을 알고 있습니다.
template <class CONTAINER>
void f(CONTAINER *c){}
int main(){
std::vector<int> v;
f(&v);
std::set<int> s;
f(&s);
}
그런 다음 다음과 같은 대안 (내 프로젝트에 편리한)을 원합니다.
template <class CONTAINER>
void f(CONTAINER<int> *c){} // the CONTAINER is the name of a template class
그러나 컴파일러는
error: ‘CONTAINER’ is not a template
이것이 가능한가?
템플릿 템플릿 매개 변수를 찾고 있습니다 .
#include <set>
#include <vector>
template<template<typename> typename CONTAINER>
void f(CONTAINER<int> *){}
int main(){
std::vector<int> v;
f(&v);
std::set<int> s;
f(&s);
}
"호환 가능한 인수에 템플릿 템플릿 매개 변수 일치" 는 C ++ 17 기능입니다. std::vector
둘 이상의 템플릿 매개 변수가 있으므로 C ++ 14에서는 작동하지 않습니다 .
-frelaxed-template-template-args
Clang으로이 코드를 컴파일 해야 합니다. 참조 : 함수 템플릿의 템플릿 템플릿 매개 변수 및 P0522R0이 코드를 깨는 방법은 무엇입니까?
또 다른 방법은 가변 템플릿과 함께 템플릿 템플릿 매개 변수를 사용하여 "호환 가능한 인수에 템플릿 템플릿 매개 변수 일치" 를 방지하는 것입니다 .
#include <set>
#include <vector>
template<class T, template<class, class...> class CONTAINER, class... Args>
void f(CONTAINER<T, Args...> *){}
int main(){
std::vector<int> v;
f(&v);
std::set<int> s;
f(&s);
}
또는
#include <set>
#include <vector>
template<template<class, class...> class CONTAINER, class... Args>
void f(CONTAINER<int, Args...> *){}
int main(){
std::vector<int> v;
f(&v);
std::set<int> s;
f(&s);
}
이것은 C ++ 11에서 작동합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다