2013-03-27 5 views
5

Capisco che non è possibile dichiarare un metodo virtuale come modello, perché il compilatore non saprebbe quante voci riservare nella tabella virtuale. Questa è, comunque, una limitazione tecnica, piuttosto che una lingua. Il compilatore potrebbe sapere quante istanze del modello sono effettivamente necessarie e "tornare indietro" per allocare una dimensione vtable corretta.non è possibile la creazione di funzioni virtuali. Solo una limitazione tecnica temporanea?

Esiste una soluzione tecnica pianificata nel prossimo standard?

+0

Potete per favore fornire un esempio di ciò che si desidera realizzare (se la limitazione del compilatore potrebbe essere ignorata). –

+0

Forse un approccio più perspicace è quello di chiedere a quali cerchi si deve passare per far funzionare un meccanismo simile nell'attuale C++ e quindi come tale processo potrebbe essere automatizzato. Dopo tutto, qualsiasi struttura di dati finale desiderata è già dentro la potenza espressiva della lingua. L'unico problema è che 'template <…> virtual' non è il modo per arrivarci. – Potatoswatter

+1

@Roee: Niente in particolare, solo cercando di capire l'ambiente. –

risposta

4

Il compilatore non può mai conoscere tutte le possibili istanze di un modello. Sotto l'attuale modello di compilazione, ogni unità di traduzione viene compilata separatamente e successivamente collegata. Quando si compila un tipo di modello in un'unità di traduzione, non si conoscono le istanze di quel tipo in un'altra.

Immagina di scrivere una libreria e di utilizzare una funzione di modello. Compilate la libreria e poi la distribuirete ai vostri clienti. Ora i client possono istanziare la funzione del modello con qualsiasi argomento del modello che preferiscono, ma la tua libreria è già stata compilata! Non può "tornare indietro" e cambiare questo.

Si presume che quando si compila la funzione modello, è disponibile anche ogni istanziazione di tale funzione. Questo spesso non è il caso e, secondo l'attuale modello di compilazione e linking, non può essere noto per essere il caso.

+0

Beh, questo è vero, ma non potrebbero risolvere con un vtable dinamico? Capisco il livello di disordine che questo richiede però. –

+0

D'altra parte, una volta creato un programma completo, è stato risolto il set di istanze di template; in linea di principio, i metadati virtuali potrebbero essere generati in quel punto, piuttosto che quando viene definita la classe base. Quindi non è un ostacolo insormontabile, solo uno che avrebbe bisogno di un cambiamento fondamentale per il modello di compilazione/collegamento attualmente definito dalla lingua (e ancora più modifiche se si desidera supportare il collegamento dinamico). –

+1

@StefanoBorini Certo, * potrebbe * essere risolto. Niente è impossibile! Richiederebbe alcune modifiche piuttosto pesanti al modo in cui i programmi C++ sono compilati e collegati che dovrebbero anche essere riflessi nello standard. –

3

È sicuramente possibile per eseguire questa operazione, non essendoci requisiti per lavorare con i linker esistenti. Cioè, il linker potrebbe setacciare tutte le istanze di quella funzione template e costruire le strutture dati appropriate. Ma uno dei punti di forza del C++ è che non richiede linker specializzati; questo lo rende portabile a sistemi in cui il linker è scritto in pietra e non può essere modificato. E, sì, ciò accade; il linker è dove all il codice oggetto soddisfa e deve essere compatibile con tutti i linguaggi di programmazione supportati dal sistema e che, a sua volta, significa che a volte è diventato vecchio e crufty e il cambiamento comporta un sostanziale rischio di rottura. Quindi, mentre è teoricamente possibile farlo, non succederà.

1

Attualmente non è stato pianificato nulla in base al Comitato per gli standard C++ papers e core language issues. Lo standard C++ specifica i requisiti per le implementazioni di C++, ma non definisce l'implementazione tecnica stessa. Quindi, le funzioni virtuali del template non sono esplicitamente una limitazione tecnica, ma piuttosto una limitazione del linguaggio definito dallo standard. Tuttavia, la limitazione della lingua può essere il risultato del rischio implicato nel cambiare le implementazioni esistenti piuttosto che essere imposte come conseguenza dei limiti tecnici di un'implementazione.

Problemi correlati