2016-07-13 6 views
0

Ich mag eine integer_sequence verwenden, wenn eine Reihe von Zahlen zu beurteilen, alle unter einem bestimmten Wert ist: is_range() wird true zurück, sonst false zurück, wie unten:C++ 17: integer_sequence Verwendung mit Kompilierungsfehler

#include<utility> 
#include<iostream> 
using namespace std; 
template <std::size_t N, std::size_t... Ix> 
bool in_range(std::index_sequence<Ix...>) { 
    return ((Ix < N) && ...); 
} 
int main() 
{ 
    cout<<in_range<10>({1,2,30})<<endl; 
    cout<<in_range<10>(1,2,3)<<endl; 
    return 0; 
} 

Ich verwendete clang3.8, um es zu kompilieren, aber fehlgeschlagen.

$ clang++ m.cpp -std=c++1z 
m.cpp:5:37: error: template argument for template type parameter must be a type 
bool in_range(std::integer_sequence<Ix...>) { 
            ^~~~~ 
/usr/bin/../lib/gcc/x86_64-linux-gnu/5.3.1/../../../../include/c++/5.3.1/utility:229:21: note: 
     template parameter is declared here 
    template<typename _Tp, _Tp... _Idx> 
        ^
m.cpp:10:11: error: no matching function for call to 'in_range' 
    cout<<in_range<10>({1,2,30})<<endl; 
      ^~~~~~~~~~~~ 
m.cpp:11:11: error: no matching function for call to 'in_range' 
    cout<<in_range<10>(1,2,3)<<endl; 
      ^~~~~~~~~~~~ 
3 errors generated. 

Wie soll ich meinen Code korrigieren? Ich nehme an, mein Verständnis der Faltenausdruck ist falsch

Wie kann ich es korrigieren?

+0

Die 'std :: index_sequence' erwartet einen Typ als erstes Template-Argument. Sie übergeben den 'size_t'-Wert' Ix', der eine Ganzzahl ist. –

+0

@MarvinSielenkemper: 'std :: integer_sequence' erwartet einen Typ als erstes Template-Argument -' std :: index_sequence' ist der erste für 'std :: size_t'. – ildjarn

Antwort

2

Hier ist keine index_sequence erforderlich, Sie können einfach die Liste der Zahlen als Vorlage Argumente übergeben.

template <std::size_t N, std::size_t... Ix> 
bool in_range() { 
    return ((Ix < N) && ...); 
} 
cout<<in_range<10,1,2,30>()<<endl; 

Oder wenn Sie wollen, dass sie als Argumente für die Funktion Vorlage passieren

template <std::size_t N, typename... Ix> 
bool in_range(Ix... ix) { 
    return ((ix < N) && ...); 
} 
cout<<in_range<10>(1U,2U,30U)<<endl; 

Schließlich, wenn Sie in der Lage sein wollen in_range eine verspannt-init-Liste übergeben Sie akzeptieren, sollten ein initializer_list<size_t>. Andernfalls schlägt die Vorlageargumentableitung fehl, da braced-init-list kein Ausdruck ist und daher keinen Typ hat.

template <std::size_t N> 
constexpr bool in_range(std::initializer_list<std::size_t> ix) { 
    for(auto i : ix) { 
     if(i >= N) return false; 
    } 
    return true; 
} 
cout<<in_range<10>({1,2,30})<<endl; 

Live demo

Verwandte Themen