voglio essere in grado di passare i riferimenti degli oggetti ereditati da DBMetaData
come argomento di modello non standardizzate di un'altra classe, DBVar
:C argomento di un template non standardizzate ++ prendendo ereditato classe
#include <iostream>
class DBMetaData
{
public:
virtual const char *description() const = 0;
};
class DBMetaData_NT
: public DBMetaData
{
public:
const char *description() const
{ return "Useless description."; }
};
#if DO_WHAT_I_WANT
template< const DBMetaData &Metadata >
#else
template< typename MetadataType,
const MetadataType &Metadata >
#endif // DO_WHAT_I_WANT
class DBVar
{
public:
/// Descrição da variavel.
const char *description() const
{ return Metadata.description(); }
};
DBMetaData_NT _md_u1;
#if DO_WHAT_I_WANT
DBVar<_md_u1> _u1;
#else
DBVar< DBMetaData_NT, _md_u1 > _u1;
#endif // DO_WHAT_I_WANT
int main()
{
std::cout << "_md_u1.description() = " << _md_u1.description() << std::endl;
std::cout << "_u1.description() = " << _u1.description() << std::endl;
return 0;
}
posso compilare ed eseguire l'esempio precedente ma Ho bisogno di specificare esplicitamente il tipo ereditato.
Se provo a compilarlo definire DO_WHAT_I_WANT
(voglio passare un riferimento - o un puntatore - di tipo DBMetaData
ad un oggetto di qualsiasi classe ereditata), ottengo l'errore:
templ_inh_arg.cpp:36:15: error: could not convert template argument ‘_md_u1’ to ‘const DBMetaData&’
templ_inh_arg.cpp:36:20: error: invalid type in declaration before ‘;’ token
Perché puo' t Passaggio _u1
, ovvero di tipo DBMetaData_NT
che eredita da DBMetaData
come parametro per DBVar<_md_u1> _u1;
?
C'è un modo per ottenere ciò che voglio?
Grazie!
EDIT:
Sostituzione del parametro di modello con un puntatore a funzione, come suggerito da @ecatmur risolto il mio problema e, devo notare, trasformato il mio codice un po 'più leggibile.
#include <iostream>
class DBMetaData
{
public:
/// Descrição da variavel.
virtual const char *description() const = 0;
};
class DBMetaData_NT
: public DBMetaData
{
public:
const char *description() const
{ return "Useless description."; }
};
typedef const DBMetaData &(*metadata)();
template< metadata Metadata >
class DBVar
{
public:
/// Descrição da variavel.
const char *description() const
{ return Metadata().description(); }
};
const DBMetaData & _md_u1_metadata()
{
static const DBMetaData_NT _md_u1;
return _md_u1;
}
DBVar<_md_u1_metadata> _u1;
int main()
{
std::cout << "_md_u1_metadata().description() = " << _md_u1_metadata().description() << std::endl;
std::cout << "_u1.description() = " << _u1.description() << std::endl;
return 0;
}
Questo è tutto. Una funzione. Risolve il mio problema. Ho modificato la mia domanda con una soluzione basata sulle funzioni. Grazie! – j4x
Mi chiedo se il termine "covarianza" si applica qui. È noto (http: // StackOverflow.it/questions/2203388/c-templates-polymorphism) che i modelli C++ non sono covarianti. Sembra che si possa affermare che neanche i parametri di tipo non di modello sono covarianti. – pfalcon