0

我能够很好地专门化构造函数:

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 名称。但是,如果对象本身在没有帮助的情况下知道,那就太好了。

4

1 回答 1

3

这里的问题是你不能部分特化函数,构造函数就是函数。您要么完全专业化它们,要么根本不专业化它们。

这个问题的一个常见解决方案是使用标签调度,但是在您的特定用例中它有点简单......使用static_cast

template < typename TType, int n >
class Field
{
public:
    Field( float f )
        : _type( static_cast<TType>(f) )
    { }

protected:
    TType    _type;
};

演示

于 2016-11-04T20:40:36.960 回答