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

Specialization template class with templated function

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

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

现在我想将这些 classes 拆分为声明和实现(.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<> 行,所有编译都可以,但我仍然有一个问题:这是正确的解决方案还是我遗漏了什么?

If I delete line template<> all compiles ok, but I still has question: is it right solution or I missed something?

没错,您只需删除该行即可。 AdditionalValueStaticCaster<void> 是具体类型,您只是在该类型上提供成员函数模板的定义。因此:

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

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

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

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

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

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