typedef auf variadic template

18/11/2016 - 16:51 von Markus Donath | Report spam
Ich benötige hàufig eine Überprüfung, ob ein Wert in einer Reihe von
Werten vorkommt. Dabei finde ich:

if(n==3 || n==5 || n=' || n==-1327)

unschön.

Deshalb habe ich mir gebaut:

template<typename T, T ... items>
inline bool is_in(const T& item) {
T match_items[sizeof...(items)] = { items... };
for(int i = 0; i < sizeof...(items); ++i)
if(item == match_items[i])
return true;
return false;
}

Und kann somit prüfen:

if(is_in<int, 3, 5, 27, -1327>(n))

Was mir jetzt noch fehlt ist ein typedef um im Aufruf nicht den Typ
mitgeben zu müüsen, also:

if(is_in_ints<3, 5, 27, -1327>(n))

aber ich bekomme diesen typedef nich hin

typedef is_in<int, int ... items> is_in_ints;

funktioniert schon mal nicht. Was mache ich falsch?


Markus
 

Lesen sie die antworten

#1 Stefan Reuther
20/11/2016 - 11:14 | Warnen spam
Am 18.11.2016 um 16:51 schrieb Markus Donath:
template<typename T, T ... items>
inline bool is_in(const T& item) {
T match_items[sizeof...(items)] = { items... };
for(int i = 0; i < sizeof...(items); ++i)
if(item == match_items[i])
return true;
return false;
}



Wie wàr's damit:
template<typename T>
inline bool is_in(const T& item, const T& value)
{
return item == value;
}

template<typename T, typename... Values>
inline bool is_in(const T& item, const T& value, Values... values)
{
return item == value || is_in(item, values...);
}

Aufruf als 'is_in(n, 3, 5, 27, -1327)'. Nachteil: da der Typ nicht
angegeben ist, müssen die Parametertypen halt von vornherein passen.


Stefan

Ähnliche fragen