난과 같이, 가변-템플릿 기능을 사용하는 라이브러리를 작성하고 기능 설명 같은 : int
인수의 최대 수는 const가 아닌 maxArgs()
입니다명시 적 인스턴스화는
template class func<int>;
template class func<int, int>;
template class func<int, int, int>;
// ...
(이 외부 함수이기 때문에 나는 이것을 변경할 수 없습니다입니다). 나는 다음 시도했다 : 그것은 컴파일에 실패 그래서 컴파일러는 함수 생성 재귀에 적절한베이스 케이스가없는 그러나
template<typename ... T>
void f(size_t max, T ... args) { // Generates "infinitely"
if (sizeof...(T) < max) {
func(args...);
f(max, args..., 0);
}
}
int main(int argc, char** argv) {
f(maxArgs(), 0);
// ...
return 0;
}
. 나 또한 그렇게 (here에서 몇 가지 코드를 사용하여) 같은 비 형 템플릿을 사용하여 시도했다 :
template<int ...> struct seq { };
template<int N, int ... Ns> struct gens : gens<N-1, N-1, Ns...> { };
template<int ... Ns> struct gens<0, Ns...> { typedef seq<Ns...> type; };
std::vector<int> params;
template<int ... Ns>
void f(seq<Ns...>) {
test(std::get<Ns>(params)...);
}
void instantiate(size_t max) {
for (int i = 1; i < max; ++i) {
for (int j = 0; j < i; ++j) {
params.push_back(0);
}
f(typename gens<i>::type()); // Fails to compile -- i is not const
params.clear();
}
}
int main(int argc, char** argv) {
instantiate(maxArgs());
}
하지만 그것뿐만 아니라 컴파일에 실패 있도록이는 CONST 값이 필요합니다. maxArgs()
의 반환 값을 알지 못해 제대로 수행 할 수 있습니까?
컴파일러 (특히 gcc)는 줄임표와 va_list를 사용하는 C 스타일 가변 인수 함수의 코드 생성을 어떻게 처리합니까? 예를 들면 다음과 같습니다 :'void func (int a, ...) {...}' –