Я могу специализироваться конструкторы отлично:как специализироваться конструктор шаблона
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()))
{
}
Есть ли уловка для этого? Думаю, я мог бы передать имя const char во время установки() во время выполнения. Но это было бы аккуратно, если бы сам объект знал без посторонней помощи.
Я не вижу причин для этого частичная специализация (даже если это разрешено). Поплавок будет преобразован в double или int неявно. –
для моих реальных потребностей аргумент будет более сложным. Для простоты я сделал это POD. – edwinc
@edwinc: Будет ли аргумент иметь оператор преобразования для целевого типа? – AndyG