Nota: tutto ciò che segue utilizza l'implementazione Concetti TS in GCC 6.1definizione Concetto che richiede una funzione di membro template vincolata
Diciamo che ho un concetto Surface
, come il seguente:
template <typename T>
concept bool Surface() {
return requires(T& t, point2f p, float radius) {
{ t.move_to(p) };
{ t.line_to(p) };
{ t.arc(p, radius) };
// etc...
};
}
Ora Voglio definire un altro concetto, Drawable
, che corrisponde a qualsiasi tipo con una funzione membro:
template <typename S>
requires Surface<S>()
void draw(S& surface) const;
cioè
struct triangle {
void draw(Surface& surface) const;
};
static_assert(Drawable<triangle>(), ""); // Should pass
Cioè, un Drawable
è qualcosa che ha una funzione template membro const draw()
prendendo un riferimento lvalue a qualcosa che soddisfi i requisiti Surface
. Questo è ragionevolmente facile da specificare a parole, ma non riesco a capire come farlo in C++ con TS Concetti. La sintassi "ovvio" non funziona:
template <typename T>
concept bool Drawable() {
return requires(const T& t, Surface& surface) {
{ t.draw(surface) } -> void;
};
}
error: 'auto' parameter not permitted in this context
aggiunta di un secondo parametro di modello permette di definire il concetto di compilare, ma:
template <typename T, Surface S>
concept bool Drawable() {
return requires(const T& t, S& s) {
{ t.draw(s) };
};
}
static_assert(Drawable<triangle>(), "");
template argument deduction/substitution failed: couldn't deduce template parameter 'S'
ora possiamo solo controllare se un particolare < Drawable
, Surface
>coppia corrisponde al concetto Drawable
, che non è corretto. (Un tipo D
ha la funzione membro richiesta o non lo fa: che non dipende da quale particolare Surface
controlliamo.)
Sono sicuro che è possibile fare ciò che sto cercando, ma io posso t calcoliamo la sintassi e non ci sono ancora troppi esempi online. Qualcuno sa come scrivere una definizione di concetto che richiede che il tipo abbia una funzione membro modello vincolata?
Hai provato a usare std :: is_member_function_pointer all'interno della definizione di concetti? Potrebbe funzionare. Impossibile verificare qui perché non ho installato gcc al lavoro ... –
gilgamash
Probabilmente lo stesso come http://stackoverflow.com/questions/23659382/specifying-a-concept-for-a-type-that-has-a- membro-function-template-con-concep? RQ = 1 – ecatmur