具有模板化功能的专业化模板 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);
抱歉,我没有编译器来检查这个,但语法应该很接近。
我有一些带有模板化功能的辅助模板。我将它用于其他基于策略的模板化 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);
抱歉,我没有编译器来检查这个,但语法应该很接近。