具有模板化功能的专业化模板类

时间:2016-05-12 15:26:13

标签: c++ templates template-specialization

我有一些带模板化功能的辅助模板。我将其用于其他基于策略的模板化类以强制转换或不向特定类型转换某些值:

// use this when needed additional value cast
template <typename T>
struct AdditionalValueStaticCaster
{
    template <typename U>
    static T cast(U u)
    {
        return static_cast<T>(u);
    }
};

// use this specialization when no needed to cast value
template <>
struct AdditionalValueStaticCaster<void>
{
    template <typename U>
    static U cast(U u)
    {
        return u;
    }
};

现在我想将这些类拆分为声明和实现(.h和.hh文件)

所以我写这样的声明:

template <typename T>
struct AdditionalValueStaticCaster
{
    template <typename U>
    static T cast(U u);
};


template <>
struct AdditionalValueStaticCaster<void>
{
    template <typename U>
    static U cast(U u);
};

现在我想编写实现。这没关系:

template <typename T>
template <typename U>
T AdditionalValueStaticCaster<T>::cast(U u)
{
    return static_cast<T>(u);
}

但这会导致错误error: too many template-parameter-lists

template<>
template <typename U>
U AdditionalValueStaticCaster<void>::cast(U u)
{
    return u;
}

如果我删除行template<>所有编译都没问题,但我还有一个问题:它是正确的解决方案还是我错过了什么?

2 个答案:

答案 0 :(得分:3)

  

如果我删除行template<>所有编译都可以,但我仍然有疑问:它是正确的解决方案还是我错过了什么?

这是正确的,你只需要删除该行。 AdditionalValueStaticCaster<void>是一种具体类型,您只是在该类型上提供成员函数模板的定义。因此:

template <typename U>
U AdditionalValueStaticCaster<void>::cast(U u)
{
    return u;
}

与任何其他类类型的成员函数模板没有区别:

template <typename U>
U SomeClass::cast(U u)
{
    return u;
}

答案 1 :(得分:-2)

我不认为您可以在模板中定义模板。 将所有模板参数放在第一个模板行中。像这样。

template <typename T, typename U>
struct AdditionalValueStaticCaster
{
    static T cast(U u)
    {
        return static_cast<T>(u);
    }
};

专门针对这样的实际对象:

 AdditionalValueStaticCaster< My_T_Type, My_U_Type> MyNewCaster;

并像这样使用     My_T_Type My_T_Type_var;     My_U_Type My_U_Type_var;

My_T_Type_var = MyNewCaster.cast(My_U_Type_var);

抱歉,我没有编译器来检查这一点,但语法应该很接近。