diff options
| author | Maxime Coste <frrrwww@gmail.com> | 2013-03-06 14:13:21 +0100 |
|---|---|---|
| committer | Maxime Coste <frrrwww@gmail.com> | 2013-03-06 14:27:33 +0100 |
| commit | 558f32d2d55907a85e8a2d4351817902a335463c (patch) | |
| tree | 49616cc51b34778e62b8bb4d7aa0226f62f36574 /src | |
| parent | 0e2ba188dc1bfefa0bd7e064aa7d67d7ea0784a7 (diff) | |
throw a runtime error when a wrong type is requested for an option
Diffstat (limited to 'src')
| -rw-r--r-- | src/option_manager.cc | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/src/option_manager.cc b/src/option_manager.cc index 817d5409..9471f03c 100644 --- a/src/option_manager.cc +++ b/src/option_manager.cc @@ -93,8 +93,21 @@ private: Option::Option(OptionManager& manager, String name) : m_manager(manager), m_name(std::move(name)) {} -template<typename T> const T& Option::get() const { return dynamic_cast<const TypedOption<T>*>(this)->get(); } -template<typename T> void Option::set(const T& val) { return dynamic_cast<TypedOption<T>*>(this)->set(val); } +template<typename T> const T& Option::get() const +{ + auto* typed_opt = dynamic_cast<const TypedOption<T>*>(this); + if (not typed_opt) + throw runtime_error("option " + name() + " is not of type " + typeid(T).name()); + return typed_opt->get(); +} + +template<typename T> void Option::set(const T& val) +{ + auto* typed_opt = dynamic_cast<TypedOption<T>*>(this); + if (not typed_opt) + throw runtime_error("option " + name() + " is not of type " + typeid(T).name()); + return typed_opt->set(val); +} template const String& Option::get<String>() const; template void Option::set<String>(const String&); |
