diff options
| author | Maxime Coste <frrrwww@gmail.com> | 2013-04-17 19:10:51 +0200 |
|---|---|---|
| committer | Maxime Coste <frrrwww@gmail.com> | 2013-04-17 19:10:51 +0200 |
| commit | 021756dfd44700cfd8d3308df11aa84d3adcc806 (patch) | |
| tree | be99878b98e9eb7a8295d66cc40433d6455ddea6 /src/option_manager.hh | |
| parent | 21f487417b6c6af028254a2788f57e547b1041c4 (diff) | |
redeclaring an option with the same type is not an error
Diffstat (limited to 'src/option_manager.hh')
| -rw-r--r-- | src/option_manager.hh | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/src/option_manager.hh b/src/option_manager.hh index 129f09bb..b195d98a 100644 --- a/src/option_manager.hh +++ b/src/option_manager.hh @@ -27,6 +27,7 @@ public: template<typename T> const T& get() const; template<typename T> void set(const T& val); + template<typename T> bool is_of_type() const; virtual String get_as_string() const = 0; virtual void set_from_string(const String& str) = 0; @@ -139,6 +140,11 @@ template<typename T> void Option::set(const T& val) return typed_opt->set(val); } +template<typename T> bool Option::is_of_type() const +{ + return dynamic_cast<const TypedOption<T>*>(this) != nullptr; +} + template<typename T> auto find_option(T& container, const String& name) -> decltype(container.begin()) { @@ -155,8 +161,13 @@ public: template<typename T> Option& declare_option(const String& name, const T& value) { - if (find_option(m_options, name) != m_options.end()) - throw runtime_error("option " + name + " already declared"); + auto it = find_option(m_options, name); + if (it != m_options.end()) + { + if ((*it)->is_of_type<T>()) + return **it; + throw runtime_error("option " + name + " already declared with different type"); + } m_options.emplace_back(new TypedOption<T>{*this, name, value}); return *m_options.back(); } |
