c++ - C++ 中的惰性对象创建,或如何进行零成本验证

标签 c++ validation

我偶然发现了 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/

相关文章:

c++ - 在 C++/Qt 中作为 lambda 函数参数的槽

.net - ASP.NET MVC 验证组?

html - Materialise Framework - 所需字段的验证不起作用

validation - 在 Odoo 的模型中添加验证

php - 如何阻止表单提交按钮刷新页面?

c++ - 使用 Atmel Studio C++ Build 时无法在 xmega 中使用 ISR

c++ - 为什么 tolower 不将我的大写字符转换为小写字符?

c++ - QSqlQuery.record() 总是空的

c++ - 在已发布的结构中添加构造函数(在 memcpy 中使用)是否安全?

java - 使用正则表达式进行键=值对验证