gpt4 book ai didi

c++ - 在 C++ 中实现变量约束

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:09:06 26 4
gpt4 key购买 nike

我一直在寻找一个示例来展示如何在 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,而且我无法找出它们是什么。现在,我实际上不需要那么多不同类型的约束,所以我可以省略模板并对它们进行硬编码。不过,我想知道是否有通用(或至少更简洁/优雅)的解决方案,或者我的方法是否有任何严重错误。

最佳答案

对于小例子来说看起来不错。但一定要实现所有运算符并以某种方式处理错误值。

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

使用boost operators帮助您解决运算符过载问题。

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

我会使用这样的类(class)。最好有一个索引参数来自动检查 vector 范围并进行断言。

void foo( VectorIndex i );

关于c++ - 在 C++ 中实现变量约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/751069/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com