2016-11-04 4 views
1

Am versuchen, einige einfache variadische Vorlage mit nicht-Type-Name Parameter zu bauen:Variadische Vorlagen, Rekursion, nicht-Type-Name Parameter

#include <iostream> 

    void myf() 
    { 
    } 

    template<int Arg1, int ... Args> void myf() 
    { 
    std::cout << Arg1 << ", "; 
    myf<Args...>(); 
    } 

    int main() 
    { 
    myf<1,2,3,4,5>(); 
    } 

Der Versuch, dies zu kompilieren und bekam:

test.cpp: In instantiation of ‘void myf() [with int Arg1 = 5; int ...Args = {}]’: 
test.cpp:10:18: recursively required from ‘void myf() [with int Arg1 = 2; int ...Args = {3, 4, 5}]’ 
test.cpp:10:18: required from ‘void myf() [with int Arg1 = 1; int ...Args = {2, 3, 4, 5}]’ 
test.cpp:15:20: required from here 
test.cpp:10:18: error: no matching function for call to ‘myf()’ 
    myf<Args...>(); 
      ^
test.cpp:10:18: note: candidate is: 
test.cpp:7:39: note: template<int Arg1, int ...Args> void myf() 
    template<int Arg1, int ... Args> void myf() 
           ^
test.cpp:7:39: note: template argument deduction/substitution failed: 
test.cpp:10:18: note: couldn't deduce template parameter ‘Arg1’ 
    myf<Args...>(); 

Es scheint, Rekursionsterminierung funktioniert nicht. Was ist der richtige Weg, um nicht typename variadic Vorlage Rekursion zu beenden?

Antwort

1

Die richtige Lösung wäre, den letzten Fall wie der Fall eines Parameters haben statt die ohne Parameter Fall. Das Problem ist, dass Ihr letzter Anruf zu diesem erweitert:

myf<>(); 

Das ist nicht ganz gültig.

Stattdessen sollten Sie dies tun:

// one parameter case: 
template<int Arg> 
void myf() 
{ 
    std::cout << Arg << std::endl; 
} 

// two or more parameters: 
template<int Arg1, int Arg2, int... Args> 
void myf() 
{ 
    std::cout << Arg1 << ", " << Arg2 << ", "; 
    myf<Args...>(); 
} 

Hier ist ein anschauliches Beispiel bei Coliru

Verwandte Themen