我希望能夠通過從DBMetaData
繼承作爲另一個類的無類型模板參數的對象的引用,DBVar
:C++無類型模板參數服用繼承的類
#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;
}
我可以編譯和運行上面的例子但我需要顯式指定繼承類型。
如果我嘗試編譯它定義DO_WHAT_I_WANT
(我想傳遞一個參考 - 或指針 - DBMetaData
類型的任何繼承的類的對象),我得到的錯誤:
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
爲什麼能」 t我通過_u1
,即DBMetaData_NT
類型,它繼承DBMetaData
作爲DBVar<_md_u1> _u1;
的參數?
有什麼辦法得到我想要的?
謝謝!
編輯:
與函數指針的更換模板參數,如@ecatmur解決我的問題和建議,我必須指出,把我的代碼更易讀。
#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;
}
就是這樣。一個函數。它解決了我的問題。我使用基於功能的解決方案編輯了我的問題。謝謝! – j4x
我想知道,如果術語「協方差」在這裏適用。它是已知的(http:// stackoverflow。com/questions/2203388/c-templates-polymorphism)C++模板不是協變的。看起來可以這樣說,模板非類型參數也不是協變的。 – pfalcon