2017-01-30 1 views
3

Ich schreibe ein Konzept, das eine Klasse erfordert eine ValueType Typ alias haben und haben eine statische Funktion Check die ValueType nimmt und void.Konzept für eine Klasse mit verschachtelten Typen

Hier ist, was ich bisher:

template <typename T> 
concept bool Predicate() 
{ 
    return requires(T object) 
    { 
     typename T::ValueType; 
     requires (T::ValueType value) 
     { 
      {T::Check(value)} -> void; 
     }; 
    }; 
} 

Das funktioniert nicht mit dem folgenden Fehler kompiliert: error: expected ')' before 'value'.

+0

Ahh ... C++ 20 ... nice ... – rustyx

+0

'erfordert requires' und' typename' würde das minimalistische fix sein. –

Antwort

4

Hier ist eine Lösung, die ich gefunden, die Predicate in zwei getrennten Konzepte in Aufspalten besteht:

template <typename T> 
concept bool HasCheck() 
{ 
    return requires (typename T::ValueType value) 
    { 
     {T::Check(value)} -> void; 
    }; 
}; 

template <typename T> 
concept bool Predicate() 
{ 
    return requires(T object) 
    { 
     typename T::ValueType; 
     requires HasCheck<T>(); 
    }; 
} 

wandbox example


Alternativ können Sie die Kette die requires Klauseln mit &&:

template <typename T> 
concept bool Predicate() 
{ 
    return requires(T object) 
    { 
     typename T::ValueType;   
    } 
    && requires (typename T::ValueType value) 
    { 
     {T::Check(value)} -> void; 
    }; 
} 

wandbox example

+0

Danke, ich habe auch festgestellt, dass ich den 'T-Objekt'-Teil nicht brauche. – Lyberta

3

Sie sind über compicating das Problem:

template <typename T> 
concept bool Predicate = requires(typename T::ValueType obj) { 
    { T::Check(obj) } -> void; 
}; 
+1

Sie benötigen immer noch einen 'type-Namen T :: ValueType;' im Körper, wenn Sie möchten, dass dieser Teil gut sortiert, aber +1. –

Verwandte Themen