在 C++ 中实现变量约束

drb*_*rby 5 c++ constraints

我一直在寻找一个示例来展示如何在 C++ 中实现约束(或一个可以让我轻松完成此操作的 boost 库),但运气不佳。我能想到的最好的办法是:

#include <boost/function.hpp>
#include <boost/lambda/lambda.hpp>

template<typename T>
class constrained
{
    public:
        constrained(boost::function<bool (T)> constraint, T defaultValue, T value = defaultValue)
        {
            ASSERT(constraint(defaultValue));
            ASSERT(constraint(value));

            this->value = value;
            this->defaultValue = defaultValue;          
            this->constraint = constraint;                      
        }

        void operator=(const T &assignedValue)
        {
            if(constraint(assignedValue))
                value = assignedValue;      
        }   

    private:
        T value;
        T defaultValue;
        boost::function<bool (T)> constraint;
};

int main(int argc, char* argv[])
{
    constrained<int> foo(boost::lambda::_1 > 0 && boost::lambda::_1 < 100, 5, 10);

    foo = 20; // works
    foo = -20; // fails

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

当然,您可能还需要约束类提供更多功能。这只是一个起点的想法。

不管怎样,我看到的问题是我必须重载 T 定义的所有运算符,才能使其真正表现得像 T,而且我无法找出它们是什么。现在,我实际上不需要那么多不同类型的约束,所以我可以省略模板并对它们进行硬编码。尽管如此,我想知道是否有一个通用(或至少更简洁/优雅)的解决方案,或者我的方法是否有任何严重错误。

Dev*_*lar 1

我可能只是感到困惑,但如果您面临不得违反特定约束的参数,那么为它们创建一个类,检查构造函数和赋值运算符中的约束不是最简单的吗?