diff --git a/util/options.hh b/util/options.hh index d738d2473..21405e339 100644 --- a/util/options.hh +++ b/util/options.hh @@ -56,8 +56,6 @@ void fail (hb_bool_t suggest_help, const char *format, ...) G_GNUC_NORETURN G_GN struct option_group_t { virtual ~option_group_t () {} - - virtual void post_parse (GError **error G_GNUC_UNUSED) {} }; @@ -82,6 +80,12 @@ struct option_parser_t void add_main_options (); + static void + post_parse_ (void *thiz, GError **error) {} + template + static auto + post_parse_ (Type *thiz, GError **error) -> decltype (thiz->post_parse (error)) + { thiz->post_parse (error); } template static gboolean post_parse (GOptionContext *context G_GNUC_UNUSED, @@ -89,8 +93,7 @@ struct option_parser_t gpointer data, GError **error) { - auto *thiz = static_cast(data); - thiz->post_parse (error); + option_parser_t::post_parse_ (static_cast (data), error); return !*error; } @@ -512,7 +515,8 @@ struct text_options_t : option_group_t void add_options (option_parser_t *parser); - void post_parse (GError **error G_GNUC_UNUSED) override { + void post_parse (GError **error G_GNUC_UNUSED) + { if (text && text_file) g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE, @@ -548,7 +552,7 @@ struct output_options_t : option_group_t void add_options (option_parser_t *parser, const char **supported_formats = nullptr); - void post_parse (GError **error G_GNUC_UNUSED) override + void post_parse (GError **error G_GNUC_UNUSED) { if (output_format) explicit_output_format = true;