gpt4 book ai didi

c++ - 模板函数特化与虚拟输入变量?

转载 作者:行者123 更新时间:2023-11-28 03:22:31 26 4
gpt4 key购买 nike

我有一个用于创建类的工厂方法模式,我想在继续实际创建之前验证输入参数。我在这里处理两个类,A 和 B,它们每个都有自己的验证。鉴于我已经在我的创建模板函数中传递了类类型(A 或 B),我想直接使用该类型来告诉我需要使用哪个验证。我正在考虑使用模板函数特化或虚拟输入参数来做到这一点,每个都有自己的优点/缺点。如果其中任何一个看起来更合理,或者是否还有其他选择,请告诉我。谢谢!

哦,我确实考虑过将验证作为 A 或 B 的静态方法,但这看起来不太好,因为我正在处理遗留代码并且移动这些东西并不是太简单。不过,为了完整起见,我还在下面将其显示为一个选项。

模板函数特化:

优点:可以直接使用传递给 FactoryCreateClass 方法的类型来选择验证

缺点:没有利用模板方法,因为只有专门化

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
}

虚拟变量:

优点:可以直接使用传递给 FactoryCreateClass 方法的类型来选择验证

缺点:未使用的虚拟变量

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
}

静态类方法:

优点:可以直接使用传递给 FactoryCreateClass 方法的类型来选择验证

缺点:更难在遗留代码中进行此类更改

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 中进行验证?

关于c++ - 模板函数特化与虚拟输入变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15052385/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com