在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 ); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐
热点阅读
