加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

在C中实现变量约束

发布时间:2020-12-16 10:15:29 所属栏目:百科 来源:网络整理
导读:我一直在寻找一个示例,展示如何在C中实现约束(或者一个可以让我轻松完成此操作的boost库),但没有太多运气.我能想到的最好的是: #include boost/function.hpp#include boost/lambda/lambda.hpptemplatetypename Tclass constrained{ public: constrained(boo
我一直在寻找一个示例,展示如何在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;
}

当然,您可能需要从约束类中获得更多功能.这只是一个起点的想法.

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

解决方法

看起来很好的例子.但一定要实现所有运算符并以某种方式处理错误的值.

foo = 100; // works
++foo; // should throw an exception or perform an assert

使用boost operators可以帮助您减轻运算符的负担.

也许最好有一个选项作为模板参数:异常或断言.

我会用这样的课.拥有一个自动检查向量范围并进行断言的索引参数总是更好.

void foo( VectorIndex i );

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读