Discussione:
emulare le restrizioni "WHERE" nei template (QTCreator)
(troppo vecchio per rispondere)
Soviet_Mario
2019-01-27 09:44:34 UTC
Permalink
salve, sto usando QTCreator su Debian (btw : spaziale
l'ide!), vorrei che qualcuno provasse a spiegarmi come
implementare RESTRIZIONI di tipo nell'uso dei template

premetto che ho letto alcuni tutorials e risposte che
menzionano roba recente tipo "enable_if" "is_integral" (cito
senza controllare) ma non erano esempi abbastanza semplici e
non li ho capiti.

Ci sono due scenari distinti che vorrei poter gestire
1) restrizioni basate su regole/caratteristiche (non su
interfacce come VStudio ma il concetto è quello : ad es. mi
lasciava usare restrizioni tipo IComparable e IConvertible,
con la clausola WHERE aggiunta al template, che significava
concettualmente : limita i tipi istanziabili a quelli che
implementano nativamente o reimplementano una certa interfaccia)

2) aggiungere restrizioni tipo : permetti di istanziare solo
per determinate classi menzionate in una lista

Per questo secondo modo stavo per conto mio pensando a una
inelegante e goffissima soluzione basata su "union", nel
senso che non delego il compilatore alla fase di
specializzazione, ma includo nel template stessa un
container "union" con tutti i tipi passati.

ovviamente non è una soluzione.
Se qualcuno fosse gentile da farmi un esempio almeno del
primo tipo davvero minimale, di template che può venire
creato se un suo "ennesimo" parametro typename è soltanto di
tipo INTEGRAL (oppure meglio ancora NUMERIC) nativo e nessun
altro tipo ....

grazie, scusate (so che il tema è stato dibattuto un po'
ovunque ... ma non riesco a digerire le risposte purtroppo).
Oltretutto il mio C++ è datato e sto cercando solo da poco
di portarlo a pari e mi sono accorto che in 15 anni è
cambiato veramente molto
--
1) Resistere, resistere, resistere.
2) Se tutti pagano le tasse, le tasse le pagano tutti
Soviet_Mario - (aka Gatto_Vizzato)
enoquick
2019-01-27 13:55:42 UTC
Permalink
salve, sto usando QTCreator su Debian (btw : spaziale l'ide!), vorrei
che qualcuno provasse a spiegarmi come implementare RESTRIZIONI di tipo
nell'uso dei template
premetto che ho letto alcuni tutorials e risposte che menzionano roba
recente tipo "enable_if" "is_integral" (cito senza controllare) ma non
erano esempi abbastanza semplici e non li ho capiti.
Ci sono due scenari distinti che vorrei poter gestire
1) restrizioni basate su regole/caratteristiche (non su interfacce come
VStudio ma il concetto è quello : ad es. mi lasciava usare restrizioni
tipo IComparable e IConvertible, con la clausola WHERE aggiunta al
template, che significava concettualmente : limita i tipi istanziabili a
quelli che implementano nativamente o reimplementano una certa interfaccia)
2) aggiungere restrizioni tipo : permetti di istanziare solo per
determinate classi menzionate in una lista
Per questo secondo modo stavo per conto mio pensando a una inelegante e
goffissima soluzione basata su "union", nel senso che non delego il
compilatore alla fase di specializzazione, ma includo nel template
stessa un container "union" con tutti i tipi passati.
ovviamente non è una soluzione.
Se qualcuno fosse gentile da farmi un esempio almeno del primo tipo
davvero minimale, di template che può venire creato se un suo "ennesimo"
parametro typename è soltanto di tipo INTEGRAL (oppure meglio ancora
NUMERIC) nativo e nessun altro tipo ....
grazie, scusate (so che il tema è stato dibattuto un po' ovunque ... ma
non riesco a digerire le risposte purtroppo).
Oltretutto il mio C++ è datato e sto cercando solo da poco di portarlo a
pari e mi sono accorto che in 15 anni è cambiato veramente molto
Ti do solo una dritta non l'esempio,almeno per ora.
Cerca enable_if con un motore di ricerca
In c++20 le cose dovrebbero cambiare ancora,semplificando le restrizione
sui tipi dei template
Soviet_Mario
2019-01-28 13:08:26 UTC
Permalink
Post by enoquick
Post by Soviet_Mario
salve, sto usando QTCreator su Debian (btw : spaziale
l'ide!), vorrei che qualcuno provasse a spiegarmi come
implementare RESTRIZIONI di tipo nell'uso dei template
premetto che ho letto alcuni tutorials e risposte che
menzionano roba recente tipo "enable_if" "is_integral"
(cito senza controllare) ma non erano esempi abbastanza
semplici e non li ho capiti.
Ci sono due scenari distinti che vorrei poter gestire
1) restrizioni basate su regole/caratteristiche (non su
interfacce come VStudio ma il concetto è quello : ad es.
mi lasciava usare restrizioni tipo IComparable e
IConvertible, con la clausola WHERE aggiunta al template,
che significava concettualmente : limita i tipi
istanziabili a quelli che implementano nativamente o
reimplementano una certa interfaccia)
2) aggiungere restrizioni tipo : permetti di istanziare
solo per determinate classi menzionate in una lista
Per questo secondo modo stavo per conto mio pensando a una
inelegante e goffissima soluzione basata su "union", nel
senso che non delego il compilatore alla fase di
specializzazione, ma includo nel template stessa un
container "union" con tutti i tipi passati.
ovviamente non è una soluzione.
Se qualcuno fosse gentile da farmi un esempio almeno del
primo tipo davvero minimale, di template che può venire
creato se un suo "ennesimo" parametro typename è soltanto
di tipo INTEGRAL (oppure meglio ancora NUMERIC) nativo e
nessun altro tipo ....
grazie, scusate (so che il tema è stato dibattuto un po'
ovunque ... ma non riesco a digerire le risposte purtroppo).
Oltretutto il mio C++ è datato e sto cercando solo da poco
di portarlo a pari e mi sono accorto che in 15 anni è
cambiato veramente molto
Ti do solo una dritta non l'esempio,almeno per ora.
Cerca enable_if con un motore di ricerca
In c++20 le cose dovrebbero cambiare ancora,semplificando le
restrizione sui tipi dei template
si l'ho trovato su cppreference ... ma non riesco bene a
capirne l'uso.

Tra l'altro non so esattamente sino a che standard supporta
il compilatore più nuovo che ho installato qui (credo sia
GCC-6 a 64 bit, che è la 6.3.0-18) ... debian non è
particolarmente solerte nell'incorporare aggiornamenti.

cmq boh, non mi ci raccapezzo coi pochi esempi trovati di
anable_if. O sono troppo complessi o trovo solo la teoria :(

mi fa piacere che si stia facendo avanti questa esigenza,
che è un po' la quintessenza del type-checking applicato
anche ai parametri definiti "altrove" rispetto al punto di
dichiarazione.
--
1) Resistere, resistere, resistere.
2) Se tutti pagano le tasse, le tasse le pagano tutti
Soviet_Mario - (aka Gatto_Vizzato)
enoquick
2019-01-28 15:06:49 UTC
Permalink
Post by enoquick
salve, sto usando QTCreator su Debian (btw : spaziale l'ide!), vorrei
che qualcuno provasse a spiegarmi come implementare RESTRIZIONI di
tipo nell'uso dei template
premetto che ho letto alcuni tutorials e risposte che menzionano roba
recente tipo "enable_if" "is_integral" (cito senza controllare) ma
non erano esempi abbastanza semplici e non li ho capiti.
Ci sono due scenari distinti che vorrei poter gestire
1) restrizioni basate su regole/caratteristiche (non su interfacce
come VStudio ma il concetto è quello : ad es. mi lasciava usare
restrizioni tipo IComparable e IConvertible, con la clausola WHERE
aggiunta al template, che significava concettualmente : limita i tipi
istanziabili a quelli che implementano nativamente o reimplementano
una certa interfaccia)
2) aggiungere restrizioni tipo : permetti di istanziare solo per
determinate classi menzionate in una lista
Per questo secondo modo stavo per conto mio pensando a una inelegante
e goffissima soluzione basata su "union", nel senso che non delego il
compilatore alla fase di specializzazione, ma includo nel template
stessa un container "union" con tutti i tipi passati.
ovviamente non è una soluzione.
Se qualcuno fosse gentile da farmi un esempio almeno del primo tipo
davvero minimale, di template che può venire creato se un suo
"ennesimo" parametro typename è soltanto di tipo INTEGRAL (oppure
meglio ancora NUMERIC) nativo e nessun altro tipo ....
grazie, scusate (so che il tema è stato dibattuto un po' ovunque ...
ma non riesco a digerire le risposte purtroppo).
Oltretutto il mio C++ è datato e sto cercando solo da poco di
portarlo a pari e mi sono accorto che in 15 anni è cambiato veramente
molto
Ti do solo una dritta non l'esempio,almeno per ora.
Cerca enable_if con un motore di ricerca
In c++20 le cose dovrebbero cambiare ancora,semplificando le
restrizione sui tipi dei template
si l'ho trovato su cppreference ... ma non riesco bene a capirne l'uso.
Tra l'altro non so esattamente sino a che standard supporta il
compilatore più nuovo che ho installato qui (credo sia GCC-6 a 64 bit,
che è la 6.3.0-18) ... debian non è particolarmente solerte
nell'incorporare aggiornamenti.
cmq boh, non mi ci raccapezzo coi pochi esempi trovati di anable_if. O
sono troppo complessi o trovo solo la teoria :(
mi fa piacere che si stia facendo avanti questa esigenza, che è un po'
la quintessenza del type-checking applicato anche ai parametri definiti
"altrove" rispetto al punto di dichiarazione.
Io trovo l'uso di enable_if per limitare i tipi di un template un
qualcosa di barbaro
Il mio consiglio e' di non usarlo per un normale programma (si perde
solo tempo)
Potrebbe avere senso per una libreria
Per fortuna,come avevo gia scritto,sembra che in c++20 per questo le
cose cambieranno in meglio attraverso i concepts
Soviet_Mario
2019-01-28 18:39:15 UTC
Permalink
CUT
Post by enoquick
Io trovo l'uso di enable_if per limitare i tipi di un
template un qualcosa di barbaro
eh sapessi fare la stessa cosa diversamente ...

cmq, circa la nuova "versione" 20, dove potrei trovare
qualche info su dove come e quando verrà introdotta ?

Che poi bisognerà aspettare anche che qualche compilatore
(io userò lo gnu) si allinei.

grazie delle info
Post by enoquick
Il mio consiglio e' di non usarlo per un normale programma
(si perde solo tempo)
Potrebbe avere senso per una libreria
Per fortuna,come avevo gia scritto,sembra che  in c++20 per
questo le cose cambieranno in meglio attraverso i concepts
--
1) Resistere, resistere, resistere.
2) Se tutti pagano le tasse, le tasse le pagano tutti
Soviet_Mario - (aka Gatto_Vizzato)
enoquick
2019-01-29 20:31:47 UTC
Permalink
Post by Soviet_Mario
CUT
Post by enoquick
Io trovo l'uso di enable_if per limitare i tipi di un template un
qualcosa di barbaro
eh sapessi fare la stessa cosa diversamente ...
Non si puo fare fino a c++17 compreso.
Si deve per forza usare enable_if
Post by Soviet_Mario
cmq, circa la nuova "versione" 20, dove potrei trovare qualche info su
dove come e quando verrà introdotta ?
Basta cercare c++20 concepts
Qualcosa dovresti trovare.
Post by Soviet_Mario
Che poi bisognerà aspettare anche che qualche compilatore (io userò lo
gnu) si allinei.
g++ e' gia allineato a c++20 anche se non completamente e sono
attualmente futures in fase sperimentale
Basta usare -std=c++2a o gnu++2a

https://gcc.gnu.org/projects/cxx-status.html
Post by Soviet_Mario
grazie delle info
Post by enoquick
Il mio consiglio e' di non usarlo per un normale programma (si perde
solo tempo)
Potrebbe avere senso per una libreria
Per fortuna,come avevo gia scritto,sembra che  in c++20 per questo le
cose cambieranno in meglio attraverso i concepts
Loading...