튜플 유형을 기반으로 튜플을 초기화하는 함수와 컴파일 시간 인덱스를 유지하기 위해 For
size_t 템플릿 인수가 있는 functor 구조체 를 설정하고 INDEX
있습니다. 이 펑 터는 다른 템플릿 인자에 의존 할 수도 있습니다 T...
. 이 때문에 functor TClass
는 이러한 템플릿 인수를 보유하는 다른 구조 ( 이 예에서는) 내에 존재합니다 .
Bar
여기에서 호출되는 초기화 함수 template<std::size_t> class
에는 사용 된 클래스가 실제로 인덱스를 저장할 수 있는지 확인 하는 템플릿 인수가 있습니다.
내가 생각 해낸 디자인은 템플릿이 아닌 함수에서 호출 할 때 잘 작동 T2
하지만 함수의 템플릿이 wrapper의 템플릿 매개 변수를 결정하면 컴파일되지 않습니다 TClass
.
For
내부에 감싸 인 펑터의 정의는 다음과 같습니다 TClass
.
#include <cstdlib>
template <typename T> struct TClass {
template<std::size_t INDEX> struct For {
void operator()() {}
};
};
그리고 사용하려는 함수 호출은 다음과 같습니다.
template <template<std::size_t> class FOR> void bar() {
//...
}
template <typename T> void foo() {
bar<TClass<T>::For>(); //Does not compile
}
int main() {
bar<TClass<int>::For>(); //Works
foo<int>();
return 0;
}
잘못된 foo
호출에 대한 컴파일러 출력 은 다음과 같습니다.
error: dependent-name ‘TClass<T>::For’ is parsed as a non-type, but instantiation yields a type
Bar<TClass<T>::For>(); //Does not compile
종속 유형 이름 앞에는 일반적으로 a가 와야한다는 것을 알고 typename
있지만 이것은 첫 번째 bar
호출 에도 필요하지 않습니다 . 템플릿 인수는 유형으로 만 해석 될 수 있기 때문이라고 생각했습니다. 즉, 어쩌면 생각 나는 그래서 typename
올바른 컴파일 초래하지만 변경하는 경우 foo
에
template <typename T> void foo() {
bar<typename TClass<T>::For>(); //Does not compile
}
나는 얻다:
error: ‘typename TClass<int>::For’ names ‘template<long unsigned int INDEX> struct TClass<int>::For’, which is not a type
Bar<typename TClass<T>::For>(); //Does not compile
더 이상 중첩 유형을 사용할 필요가 없기 때문에- ()
연산자가 TClass
템플릿 에 의존 하는 디자인도 생각해 냈습니다 INDEX
. 다음과 같이 보입니다.
#include <cstdlib>
template <typename T> struct TClass {
template<std::size_t INDEX> void operator()() {}
};
template <typename FOR> void bar() {
//...
}
template <typename T> void foo() {
bar<TClass<T>>(); //Does compile
}
분명히 유형의 템플릿이 함수의 템플릿 매개 변수에 의해 결정되는 함수에서 종속 유형 이름을 사용할 수 없지만 그 이유는 무엇입니까? 그리고 이것을 올바르게 구현하는 방법은 무엇입니까? 유형 특성으로 향후 유형 검사를 더 쉽게 작성하려면 펑터를 사용할 수 있으면 선호합니다.
컴파일러는 TClass<T>::For
템플릿 인스턴스화의 첫 번째 단계에서 템플릿 을 참조 하는 것을 알 수 없습니다 . template
키워드에 대한 약간의 도움이 필요합니다 . 고치다:
template <typename T> void foo() {
bar<TClass<T>::template For>();
}
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다