具有模板化函数的专业化模板类

4

我有一些带有模板函数的辅助模板。我将其用于其他基于策略的模板类中,以将某些值转换或不转换为特定类型:

// 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个回答

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;
}

-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);

很抱歉我没有编译器来进行检查,但是语法应该很接近。


是的,你可以。你应该试一试。 - Barry

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接