Torna indietro   Hardware Upgrade Forum > Software > Programmazione

I nuovi schermi QD-OLED di quinta generazione di MSI, per i gamers
I nuovi schermi QD-OLED di quinta generazione di MSI, per i gamers
MSI continua ad investire nel proporre schermi pensati per rispondere alle esigenze dei videogiocatori, utilizzando la quinta generazione di tecnologia QD-OLED sviluppata da Samsung. Il modello MPG 341CQR QD-OLED X36 è lpultima novità al debutto in concomitanza con il CES 2026, uno schermo curvo di ampia risoluzione pensato per i videogiocatori più esigenti
Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria
Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria
vivo X300 Pro rappresenta un'evoluzione misurata della serie fotografica del produttore cinese, con un sistema di fotocamere migliorato, chipset Dimensity 9500 di ultima generazione e l'arrivo dell'interfaccia OriginOS 6 anche sui modelli internazionali. La scelta di limitare la batteria a 5.440mAh nel mercato europeo, rispetto ai 6.510mAh disponibili altrove, fa storcere un po' il naso
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo
Lenovo Legion Go 2 è la nuova handheld PC gaming con processore AMD Ryzen Z2 Extreme (8 core Zen 5/5c, GPU RDNA 3.5 16 CU) e schermo OLED 8,8" 1920x1200 144Hz. È dotata anche di controller rimovibili TrueStrike con joystick Hall effect e una batteria da 74Wh. Rispetto al dispositivo che l'ha preceduta, migliora ergonomia e prestazioni a basse risoluzioni, ma pesa 920g e costa 1.299€ nella configurazione con 32GB RAM/1TB SSD e Z2 Extreme
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 08-11-2005, 14:31   #1
Renxy
Junior Member
 
Iscritto dal: Nov 2005
Messaggi: 9
Help Template C++

salve a tutti.
devo realizzare una classe con un parametro template.
il tipo template sarà una struttura dati di vario tipo.
come faccio a limitare le possibilità di scelta a un numero limitato di tipi?

le implementazaioni delle funzioni membro della classe che devo realizzare si devono diversificare a seconda del tipo template scelto. come si può realizzare questo?

Thanx
Renxy è offline   Rispondi citando il messaggio o parte di esso
Old 08-11-2005, 15:19   #2
fek
Senior Member
 
L'Avatar di fek
 
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
Quote:
Originariamente inviato da Renxy
salve a tutti.
devo realizzare una classe con un parametro template.
il tipo template sarà una struttura dati di vario tipo.
come faccio a limitare le possibilità di scelta a un numero limitato di tipi?
Non puoi in C++.

Quote:
le implementazaioni delle funzioni membro della classe che devo realizzare si devono diversificare a seconda del tipo template scelto. come si può realizzare questo?
Mi fai un esempio di quello che vuoi fare?

Puoi creare metodi parametrizzati che si basano su un tipo anche diverso da quello con cui parametrizzi la classe. Oppure molto semplicemente scrivi il metodo in termini del tipo parametrico.

Sei sicuro che per risolvere il tuo problema ti devi andare a impelagare con i template in C++? Non e' un argomento banale. Valuta la possibilita' di virtualizzare l'implementazione della tua classe dinamicamente usando il polimorfismo classico.
fek è offline   Rispondi citando il messaggio o parte di esso
Old 08-11-2005, 15:34   #3
Renxy
Junior Member
 
Iscritto dal: Nov 2005
Messaggi: 9
Quote:
Originariamente inviato da fek
Mi fai un esempio di quello che vuoi fare?

Puoi creare metodi parametrizzati che si basano su un tipo anche diverso da quello con cui parametrizzi la classe. Oppure molto semplicemente scrivi il metodo in termini del tipo parametrico.

Sei sicuro che per risolvere il tuo problema ti devi andare a impelagare con i template in C++? Non e' un argomento banale. Valuta la possibilita' di virtualizzare l'implementazione della tua classe dinamicamente usando il polimorfismo classico.
devo usare i tamplate "per contratto", diciamo.
devo realizzare una classe del tipo :

template<class T> class MiaClasse {};
dove T è una struttra dati.
a seconda della struttura dati utilizzata i metodi da esegure sulla MiaClasse devon essere implementati in modi diversi.
Renxy è offline   Rispondi citando il messaggio o parte di esso
Old 08-11-2005, 15:36   #4
fek
Senior Member
 
L'Avatar di fek
 
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
Quote:
Originariamente inviato da Renxy
template<class T> class MiaClasse {};
dove T è una struttra dati.
a seconda della struttura dati utilizzata i metodi da esegure sulla MiaClasse devon essere implementati in modi diversi.
Ci sono diverse strategie per fare questo. Fammi un esempio di uno di questi metodi.
fek è offline   Rispondi citando il messaggio o parte di esso
Old 08-11-2005, 16:17   #5
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Quote:
Originariamente inviato da Renxy
a seconda della struttura dati utilizzata i metodi da esegure sulla MiaClasse devon essere implementati in modi diversi.
Mi convince poco... Usi un template e poi vai a discriminarne il tipo ?!?!?
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 16-01-2006, 13:18   #6
Renxy
Junior Member
 
Iscritto dal: Nov 2005
Messaggi: 9
Quote:
Originariamente inviato da fek
Ci sono diverse strategie per fare questo. Fammi un esempio di uno di questi metodi.
riesumo questo thread.
spiego meglio il mio problema.

devo realizzare una classe c++ che realizzi una struttura dati template "vettore sparso", il parametro template è il tipo dei dati contenuti nel vettore.

esistono diverse possibili implementazioni della struttura : utilizzo di una coppia di std::vector, una coppia di array, un lista, un ABR, una hash table, una std::map.
dovrei rendere possibile l'utilizzo di tutte le implementazioni : l'utente sceglie all'inizio il contenitore e poi deve poterlo usare utilizzando un'interfaccia standard.
es:
sparseVector<int,list> myObj;
myObj.shift();
myObj.scalar(n);

come faccio a realizzare questo, ovvero utilizzar un'interfaccia standard e implementare opportunamente i diversi metodi a seconda della struttura dati scelta?

grazie
Renxy è offline   Rispondi citando il messaggio o parte di esso
Old 16-01-2006, 13:23   #7
fek
Senior Member
 
L'Avatar di fek
 
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
Quote:
Originariamente inviato da Renxy
come faccio a realizzare questo, ovvero utilizzar un'interfaccia standard e implementare opportunamente i diversi metodi a seconda della struttura dati scelta?

grazie
Policy-based Design:

In brief, policy-based class design fosters assembling a class with complex behavior out of many little classes (called policies), each of which takes care of only one behavioral or structural aspect. As the name suggests, a policy establishes an interface pertaining to a specific issue. You can implement policies in various ways as long as you respect the policy interface

C'e' una buona descrizione qui:
http://en.wikipedia.org/wiki/Policy-based_design

Questo e' il libro che ti insegna a farlo:
http://www.amazon.com/exec/obidos/AS...593598-4271856

Occhio che non e' banale. C'e' poco di piu' complesso in C++.
fek è offline   Rispondi citando il messaggio o parte di esso
Old 16-01-2006, 13:33   #8
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Ti realizzi una classe astratta che ti fa da interfaccia con l'utente (che magari contiene già la definizione di alcuni metodi comuni per tutti fli oggetti) e poi derivi da questa classe le varie implementazioni...

Nota che l'utente non dovrà conoscere nemmeno l'esistenza di queste altre classi (leggi non vanno incluse nel programma utente), ma solo della classe astratta... Dopo con un factory method della classe astratta potrai creare i vari oggetti decidendone il tipo...

Tanto per fare un esempio:

SparseVector.h
Codice:
#include "sparseVectorWithVector.h"
#include "sparseVectorWithArrayPair.h"
#include "sparseVectorWithArrayHashTable.h"

/*questa deve essere una classe astratta che definisci tutta l'interfaccia
delle classi incluse sopra*/
class SparseVector
{
...
...
   /*in base a type decidi quale Sparsevector allocare*/
   static SparseVector * create(SparseVectorType type);
};
SparseVectorWithVector.h
Codice:
#include "SparseVector.h"

class SparseVectorWithVector: public SparseVector
{
....
};
L'utente dovrà includere solo SparseVector.h
Codice:
SparseVector sparseVector = SparseVector::create(SparseVectorType::HashTable);
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 16-01-2006, 13:41   #9
fek
Senior Member
 
L'Avatar di fek
 
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
La soluzione di cionci va benissimo e ti evita l'uso dei template. Tipico esempio di "Polimorfismo Statico" contro "Polimorfismo Dinamico"
fek è offline   Rispondi citando il messaggio o parte di esso
Old 16-01-2006, 13:43   #10
Renxy
Junior Member
 
Iscritto dal: Nov 2005
Messaggi: 9
anche a me andrebbe benissimo. al mio relatore no, purtroppo.
Renxy è offline   Rispondi citando il messaggio o parte di esso
Old 16-01-2006, 13:46   #11
fek
Senior Member
 
L'Avatar di fek
 
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
Quote:
Originariamente inviato da Renxy
anche a me andrebbe benissimo. al mio relatore no, purtroppo.
Vuole per forza i template? Ti ha dato la motivazione? Ci sono delle ragioni per preferire il polimorfismo statico a quello dinamico di cionci, ma di solito hanno a che vedere con considerazioni di carattere prestazionale. E non credo che il tuo relatore ti voglia far infrangere uno dei cardini dell'ingegneria del software a cuor leggero...
fek è offline   Rispondi citando il messaggio o parte di esso
Old 16-01-2006, 13:49   #12
Renxy
Junior Member
 
Iscritto dal: Nov 2005
Messaggi: 9
mmm.. pensandoci meglio credo che la soluzione di Cionci vada bene.
template deve essere solo il tipo di dati contenuti nel vettore, non il container utilizzato.
Renxy è offline   Rispondi citando il messaggio o parte di esso
Old 16-01-2006, 13:55   #13
fek
Senior Member
 
L'Avatar di fek
 
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
Quote:
Originariamente inviato da Renxy
mmm.. pensandoci meglio credo che la soluzione di Cionci vada bene.
template deve essere solo il tipo di dati contenuti nel vettore, non il container utilizzato.
Allora la cosa si complica un po' perche' anche la classe astratta deve essere un template, visto che e' di fatto un contenitore di un tipo generico.

A occhio la soluzione di cionci dovrebbe essere comunque piu' semplice (quando ci sono di mezzo i template mi si attorciglia il cervello).

Mi fai un esempio di operazioni che il contenitore generico deve avere?
fek è offline   Rispondi citando il messaggio o parte di esso
Old 16-01-2006, 14:38   #14
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Niennte vieta di usare i template per il tipo di dato contenuto nei vettori sparsi...non so, magari è questo che vuole il relatore...
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 16-01-2006, 16:30   #15
Renxy
Junior Member
 
Iscritto dal: Nov 2005
Messaggi: 9
Quote:
Originariamente inviato da fek

Mi fai un esempio di operazioni che il contenitore generico deve avere?
servono le operazioni generiche che si usano sui vettori : inserimento, accesso per indice, norma, massimo, minimo, ordinamento etc.

Quote:
Niennte vieta di usare i template per il tipo di dato contenuto nei vettori sparsi...non so, magari è questo che vuole il relatore...
si, template deve essere il tipo di dato.
comunque anche la classe astratta deve essere template.
Renxy è offline   Rispondi citando il messaggio o parte di esso
Old 16-01-2006, 16:35   #16
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Quote:
Originariamente inviato da Renxy
comunque anche la classe astratta deve essere template.
Certo...e dovrebbe venire fuori un bel lavoretto !!!
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 16-01-2006, 17:44   #17
fek
Senior Member
 
L'Avatar di fek
 
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
Quote:
Originariamente inviato da Renxy
servono le operazioni generiche che si usano sui vettori : inserimento, accesso per indice, norma, massimo, minimo, ordinamento etc.
Ok, quindi diciamo queste tre ad esempio:

insert(T& t);
remove(int index);
sort();

Tiro a caso, per capirci.

Ecco una possibile semplice implementazione policy based:

Codice:
template <typename T>
class StandardListContainer
{
private:
	std::list<T> m_List;

public:
	void Insert(T item)
	{
		m_List.push_back(item);
	}

	void Remove(T item)
	{
		m_List.remove(item);
	}

	void Sort()
	{
		std::sort(list.begin(), list.end(), std::less<T>());
	}
};

template <typename T>
class NullContainer
{
public:
	void Insert(T item)
	{
	}

	void Remove(T item)
	{
	}

	void Sort()
	{
	}
};

template<typename T, typename ContainerPolicy = StandardListContainer<T> > class SparseVector
{
private:

	ContainerPolicy m_Container;

public:

	SparseVector()
	{
		// Insert some items just for fun...
		m_Container.Insert(T());
	}

	~SparseVector()
	{
		// Remove an item just to try the policy...
		m_Container.Remove(T());
	}

	void Process()
	{
		// Do crazy stuff here...

		m_Container.Sort();

		// Do some more crazy stuff here...
	}
};
Nota come puoi creare classi SparseVector che usino uno o l'altro container che specifichi quando instanzi il template:

Codice:
SparseVector<int> sparseVectorInt;
SparseVector<int, NullContainer<int> > nullSparseVector;
Di default usi il container basato su std::list. Il Container deve solo onorare l'interfaccia imposta implicitamente da SparseVector e questa e' la parte piu' rognosa in C++ perche' non ti concede nessuno strumento esplicito per gestirla.
fek è offline   Rispondi citando il messaggio o parte di esso
Old 16-01-2006, 17:53   #18
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Ottimo, così è ancora meglio !!!
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 16-01-2006, 18:19   #19
fek
Senior Member
 
L'Avatar di fek
 
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
Quote:
Originariamente inviato da cionci
Ottimo, così è ancora meglio !!!
In realta' se fosse possibile preferirei la tua soluzione, perche' e' piu' semplice da gestire. Quando inizia a dare errori di instanziazione di template mi va in pappa il cervello.
fek è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


I nuovi schermi QD-OLED di quinta generazione di MSI, per i gamers I nuovi schermi QD-OLED di quinta generazione di...
Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria Recensione vivo X300 Pro: è ancora lui il...
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'...
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti AWS re:Invent 2025: inizia l'era dell'AI-as-a-Se...
Cos'è la bolla dell'IA e perché se ne parla Cos'è la bolla dell'IA e perché se...
Un secondo schermo ovunque: il monitor p...
Volkswagen mostra i nuovi interni: pi&ug...
Sony WH-1000XM5 al minimo storico: le cu...
Lo smartphone da comprare oggi è ...
2 super caricatori multipli da 600W o 22...
La Russia prosegue lo sviluppo di reatto...
Roscosmos: da quest'anno ci potrà...
Amazon, tutte le offerte e qualche novit...
Sedie gaming in offerta su Amazon: desig...
Scope elettriche in offerta Amazon: mode...
Ricarica EV fino a 22 kW spendendo poco:...
Costa solo 139€ ma fa tutto: Lefant M330...
Amazon Haul spinge sul risparmio: sconti...
Oral-B iO in offerta su Amazon: maxi sco...
I cosmonauti avrebbero riparato tutte le...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 09:17.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v