- registerConfig(name, description, cfgelm_type<T>::value,
- [&value,f](const char* name) {
- value = f(name);
- });
- setDefault(name, value);
+ bindFlag(value, *names.begin(), description);
+ alias(names);
+}
+
+template<class T, class F>
+typename std::enable_if<std::is_same<
+ void,
+ decltype( std::declval<F>()(std::declval<const T&>()) )
+>::value, void>::type
+bindFlag(T& value, const char* name, const char* description,
+ F callback)
+{
+ declareFlag(name, description, value, [&value,callback](const T& val) {
+ callback(val);
+ value = std::move(val);
+ });
+}
+
+/** Bind a variable to configuration flag
+ *
+ * <pre><code>
+ * static int x;
+ * simgrid::config::bindFlag(a, "x", [](int x) { return return x > 0; });
+ * </code></pre>
+ */
+// F is a predicate, F : T const& -> bool
+template<class T, class F>
+typename std::enable_if<std::is_same<
+ bool,
+ decltype( std::declval<F>()(std::declval<const T&>()) )
+>::value, void>::type
+bindFlag(T& value, const char* name, const char* description,
+ F callback)
+{
+ declareFlag(name, description, value, [&value,callback](const T& val) {
+ if (!callback(val))
+ throw std::range_error("invalid value");
+ value = std::move(val);
+ });