diff --git a/src/cam/options.cpp b/src/cam/options.cpp
index 83601270207b67b3..b24964a8ce413a85 100644
--- a/src/cam/options.cpp
+++ b/src/cam/options.cpp
@@ -166,27 +166,3 @@ void OptionsParser::usage()
 		}
 	}
 }
-
-OptionsParser::Options::Options()
-{
-}
-
-bool OptionsParser::Options::valid() const
-{
-	return !values_.empty();
-}
-
-bool OptionsParser::Options::isSet(int opt) const
-{
-	return values_.find(opt) != values_.end();
-}
-
-const std::string &OptionsParser::Options::operator[](int opt) const
-{
-	return values_.find(opt)->second;
-}
-
-void OptionsParser::Options::clear()
-{
-	values_.clear();
-}
diff --git a/src/cam/options.h b/src/cam/options.h
index 491f6a316fffbe5b..a08bfea1ba74c96b 100644
--- a/src/cam/options.h
+++ b/src/cam/options.h
@@ -17,21 +17,25 @@ enum OptionArgument {
 	ArgumentOptional,
 };
 
+template <class T>
+class OptionsBase
+{
+public:
+	bool valid() const { return !values_.empty(); };
+	bool isSet(T opt) const { return values_.find(opt) != values_.end(); };
+	const std::string &operator[](T opt) const { return values_.find(opt)->second; };
+
+private:
+	friend class OptionsParser;
+	std::map<T, std::string> values_;
+	void clear() { values_.clear(); };
+};
+
 class OptionsParser
 {
 public:
-	class Options {
-	public:
-		Options();
-
-		bool valid() const;
-		bool isSet(int opt) const;
-		const std::string &operator[](int opt) const;
-
-	private:
-		friend class OptionsParser;
-		std::map<int, std::string> values_;
-		void clear();
+	class Options : public OptionsBase<int>
+	{
 	};
 
 	void addOption(int opt, const char *help, const char *name = nullptr,
