Idée rapide non testée : utilise un type spécial pour les arguments à convertir.
Pour convertir les arguments dans execute_dispatch, par exemple dans le cas double, "convert_arg<double>(arg)...", et pour l'appeler, tu passes des "convert_to_voxel_type{"-32768"}".Code:template<typename Input> struct convert_to_voxel_type { Input input; }; template<typename T> convert_to_voxel_type(T) -> convert_to_voxel_type<T>; // cas général, ne change rien au paramètre template<typename Voxel, typename T> T convert_arg (T value) { return value; } // surcharge pour les cas à convertir template<typename Voxel, typename T> Voxel convert_arg (convert_to_voxel_type<T> value) { return boost::lexical_cast<Voxel>(value.input); }