DBMetaData
別のクラスの非型テンプレート引数として継承されたオブジェクトの参照を渡せるようにしたいDBVar
:
#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
のパラメータとしてから継承する_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;
}