[英]Template function specialization vs. Dummy input variable?
我有一个用于创建类的工厂方法模式,我想在继续实际创建之前验证输入参数。 我在这里处理的是两个类,A和B,它们各自都有自己的验证。 鉴于我已经在我的创建模板函数中传递类类型(A或B),我想直接使用该类型来告诉我需要使用哪个验证。 我正在考虑使用模板函数专门化或虚拟输入参数来做到这一点,每个都有自己的优点/缺点。 如果其中任何一个看起来更合理,或者是否还有其他选项,请告诉我。 谢谢!
哦,我确实考虑将验证作为A或B的静态方法,但这看起来不太好,因为我正在处理遗留代码并且移动那些东西并不是太简单。 为了完整性,我还在下面展示了这个选项。
模板功能专业化:
Pro:能够直接使用传入FactoryCreateClass方法的类型来选择验证
Con:模板方法没有被利用,因为只有专业化
template <typename T>
void FactoryCreateClass (int, double)
(
bool bSuccess = ValidateBlock<T>(int, double);
if (bSuccess)
T* = T::CreateInstance();
)
template <typename T>
bool ValidateBlock (int double); // don't need an implementation here since
// all specialization require different validation
template <>
bool ValidateBlock<A> (int, double)
{
//do validation before creating A
}
template <>
bool ValidateBlock<B> (int, double)
{
//do validation before creating B
}
虚拟变量:
Pro:能够直接使用传入FactoryCreateClass方法的类型来选择验证
Con:未使用的虚拟变量
template <typename T>
void FactoryCreateClass (int, double)
(
bool bSuccess = ValidateBlock(T /*dummy*/, int, double);
if (bSuccess)
T* = T::CreateInstance();
)
bool ValidateBlock (A/*dummy*/, int, double)
{
//do validation before creating A
}
bool ValidateBlock (B/*dummy*/, int, double)
{
//do validation before creating B
}
静态类方法:
Pro:能够直接使用传入FactoryCreateClass方法的类型来选择验证
Con:更难以在遗留代码中进行此类更改
template <typename T>
void FactoryCreateClass (int, double)
(
bool bSuccess = T::ValidateBlock(int, double);
if (bSuccess)
T* = T::CreateInstance();
)
static bool A::ValidateBlock (int, double)
{
//do validation before creating A
}
static bool B::ValidateBlock (int, double)
{
//do validation before creating B
}
你忘记了第三种选择:使用特征。
template <typename> struct Trait;
template <>
struct Trait<A> {
static bool Validate(int, double);
};
template <>
struct Trait<B> {
static bool Validate(int, double);
};
接着:
template <typename T>
void FactoryCreateClass(int i, double d) {
bool const success = Trait<T>::Validate(i, d);
// ...
}
但是,当然,真正的问题是为什么不直接在CreateInstance
进行验证?
这里最合适的设计是在CreateInstance
方法中进行验证,因为任务(args验证和实例创建)是强耦合的,并且在一个地方将这些事物放在一起更加可读。
但是,可能是这种情况,您无法更改CreateInstance
方法的代码。 那么,我发现使用函数模板或虚拟变量之间没有显着差异。 后者是 ,然而,有点更明确,因此更具有可读性。
顺便说一句,一个未引用的变量确实不是一个大问题,你可以抑制它,请参阅禁用单个警告错误 ,在页面上搜索UNREFERENCED_PARAMETER
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.