我能够很好地专门化构造函数:
template < typename TType >
class Field
{
public:
Field( const Msg& )
: _type( TType() )
{ }
protected:
TType _type;
};
template < >
Field < double >::Field( const Msg& msg )
: _type( msg.extractDouble() )
{
}
template < >
Field < int >::Field( const Msg& msg )
: _type( msg.extractInt() )
{
}
但是,我需要对采用非类型参数的模板执行相同的操作,例如:
template < const char* pszName, typename TType >
class Field
{
public:
Field( const Msg& )
: _type( TType() )
{ }
static void setup( const Descriptor& d ) { // called once to setup _nIndex based on Descriptor and pszName
static int index() { return _nIndex; }
protected:
TType _type; // This class can only be sizeof TType in size
static int _index;
};
template < >
Field < ??, ?? >::Field( const Msg& msg ) // This doesn't compile
: _type( msg.extractDouble( index() ) )
{
}
template < >
Field < ??, ?? >::Field( const Msg& msg ) // This doesn't compile
: _type( msg.extractInt( index() ) )
{
}
这样做有诀窍吗?我想我可以在运行时的 setup() 期间传递 const char 名称。但是,如果对象本身在没有帮助的情况下知道,那就太好了。