我偶然发现了 this great post关于在 C# 中验证参数,现在我想知道如何在 C++ 中实现类似的东西。我喜欢这个东西的主要一点是它在第一次验证失败之前不会花费任何东西,因为 Begin()
函数返回 null
,而其他函数检查这个。
显然,我可以使用 Validate* v = 0; 在 C++ 中实现类似的功能; IsNotNull(v, ...).IsInRange(v, ...)
并让它们中的每一个传递 v
指针,并返回一个代理对象,我为其复制了所有函数.
现在我想知道是否有类似的方法可以在没有临时对象的情况下实现这一点,直到第一次验证失败。虽然我猜想在堆栈上分配类似 std::vector
的东西应该是免费的(这真的是真的吗?我怀疑空 vector 不会在堆上分配,对吧? )
最佳答案
除了 C++ 没有扩展方法这一事实(这使得无法轻松添加新验证)之外,它应该太难了。
class Validation
{
vector<string> *errors;
void AddError(const string &error)
{
if (errors == NULL) errors = new vector<string>();
errors->push_back(error);
}
public:
Validation() : errors(NULL) {}
~Validation() { delete errors; }
const Validation &operator=(const Validation &rhs)
{
if (errors == NULL && rhs.errors == NULL) return *this;
if (rhs.errors == NULL)
{
delete errors;
errors = NULL;
return *this;
}
vector<string> *temp = new vector<string>(*rhs.errors);
std::swap(temp, errors);
}
void Check()
{
if (errors)
throw exception();
}
template <typename T>
Validation &IsNotNull(T *value)
{
if (value == NULL) AddError("Cannot be null!");
return *this;
}
template <typename T, typename S>
Validation &IsLessThan(T valueToCheck, S maxValue)
{
if (valueToCheck < maxValue) AddError("Value is too big!");
return *this;
}
// etc..
};
class Validate
{
public:
static Validation Begin() { return Validation(); }
};
使用..
Validate::Begin().IsNotNull(somePointer).IsLessThan(4, 30).Check();
关于c++ - C++ 中的惰性对象创建,或如何进行零成本验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/469401/