gpt4 book ai didi

c++ - 如何专门化模板构造函数

转载 作者:行者123 更新时间:2023-11-28 05:26:40 25 4
gpt4 key购买 nike

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

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

最佳答案

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

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

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

protected:
TType _type;
};

Demo

关于c++ - 如何专门化模板构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40431275/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com