C++ で制約を実装する方法を示す例 (またはこれを簡単に実行できるブースト ライブラリ) を探していましたが、あまり運がありませんでした。私が思いついた最高のものは次のとおりです。
#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 のように動作するようにするには、T が定義するすべての演算子をオーバーロードする必要があり、それらが何であるかを知る方法がないことです。さて、実際にはそれほど多くの異なるタイプの制約は必要ないので、テンプレートを省略してハード コードするだけで済みます。それでも、一般的な(または少なくともより簡潔でエレガントな)解決策があるかどうか、または私のアプローチに深刻な問題があるかどうか疑問に思っています。