summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMaxime Coste <frrrwww@gmail.com>2013-03-06 14:13:21 +0100
committerMaxime Coste <frrrwww@gmail.com>2013-03-06 14:27:33 +0100
commit558f32d2d55907a85e8a2d4351817902a335463c (patch)
tree49616cc51b34778e62b8bb4d7aa0226f62f36574 /src
parent0e2ba188dc1bfefa0bd7e064aa7d67d7ea0784a7 (diff)
throw a runtime error when a wrong type is requested for an option
Diffstat (limited to 'src')
-rw-r--r--src/option_manager.cc17
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&);