2015-08-18 6 views
6

Come indicato in una serie di conferenze e articoli di Andrew Sutton, la proposta di Concepts Lite ha funzionalità di overload basate su concetti e allo stesso tempo non ha una nozione di mappa concettuale, cioè gli argomenti dei template sono controllati da concetti completamente da un compilatore. Detto questo non è chiaro come risolverebbero un problema descritto nel documento del 2005 da Siek e Gregor, "Explicit model definitions are necessary". In breve, il problema potrebbe essere affermato con la seguente citazione del documento.Come evitare problemi con l'overload basato su concetti senza modelli espliciti (ovvero mappe concettuali)

So, there are certain input iterator types (such as istream_iterator) that would be misclassified as forward iterators. What is the danger in this? Some algorithms dispatch based on Input_iterator vs. Forward_iterator.

(Ci sono altri esempi oltre iteratori però.)

sì, sono consapevole di quello sopra citato documento considerato C++ 0x concetti, ma il problema sembra essere “generico” over concetti proposte.

risposta

3

La proposta in n3351 A Concept Design for the STL è quello di continuare ad utilizzare categoria iteratore tags:

concept InputIterator<WeakInputIterator I> = 
    EqualityComparable<I> && 
    Derived<IteratorCategory<I>, input_iterator_tag>; 

Nella sintassi prevista per l'inclusione nello standard per n4377 C++ Extensions for Concepts:

template<typename I> 
concept bool InputIterator = 
    WeakInputIterator<I>() && EqualityComparable<I>() && 
    Derived<IteratorCategory<I>, input_iterator_tag>(); 

Dalla ex carta:

While C++11 makes it possible to evaluate all static requirements [...] we still need to differentiate some concepts based on their semantic requirements. The iterator category solves that problem for us.

In generale, si può esprimere la requisiti controllando un predicato di tipo (ad es. un tipo annidato o costante, o una funzione di tipo) che esiste esclusivamente allo scopo di affermare una semantica runtime.

+0

@Columbo Ho tentato di riscriverlo nella sintassi n4377; per favore controlla se ho capito bene (non ho accesso a un compilatore abilitato a Concepts in questo momento). – ecatmur

+1

La sintassi che avevi era corretta, ma un po 'strana in quanto non c'è bisogno di un'espressione require se non hai bisogno di fare riferimento ai suoi parametri. L'ho semplificato. – Casey

+0

@Casey geniale, grazie. – ecatmur

Problemi correlati