GNOME Bugzilla – Bug 506415
Compose with more than 9 parameters
Last modified: 2009-04-03 15:29:49 UTC
In some infrequent cases you must use the compose template function with more than 9 parameters. The following patch may solve these situations: Index: glib/glibmm/ustring.h =================================================================== --- glib/glibmm/ustring.h (revision 490) +++ glib/glibmm/ustring.h (working copy) @@ -705,6 +705,86 @@ const T4& a4, const T5& a5, const T6& a6, const T7& a7, const T8& a8, const T9& a9); + /* See the documentation for compose(const ustring& fmt, const T1& a1). + * @newin2p16 + */ + template <class T1, class T2, class T3, class T4, class T5, + class T6, class T7, class T8, class T9, class T10> + static inline + ustring compose(const ustring& fmt, + const T1& a1, const T2& a2, const T3& a3, + const T4& a4, const T5& a5, const T6& a6, + const T7& a7, const T8& a8, const T9& a9, + const T10& a10); + + /* See the documentation for compose(const ustring& fmt, const T1& a1). + * @newin2p16 + */ + template <class T1, class T2, class T3, class T4, class T5, + class T6, class T7, class T8, class T9, class T10, + class T11> + static inline + ustring compose(const ustring& fmt, + const T1& a1, const T2& a2, const T3& a3, + const T4& a4, const T5& a5, const T6& a6, + const T7& a7, const T8& a8, const T9& a9, + const T10& a10, const T11& a11); + + /* See the documentation for compose(const ustring& fmt, const T1& a1). + * @newin2p16 + */ + template <class T1, class T2, class T3, class T4, class T5, + class T6, class T7, class T8, class T9, class T10, + class T11, class T12> + static inline + ustring compose(const ustring& fmt, + const T1& a1, const T2& a2, const T3& a3, + const T4& a4, const T5& a5, const T6& a6, + const T7& a7, const T8& a8, const T9& a9, + const T10& a10, const T11& a11, const T12& a12); + + /* See the documentation for compose(const ustring& fmt, const T1& a1). + * @newin2p16 + */ + template <class T1, class T2, class T3, class T4, class T5, + class T6, class T7, class T8, class T9, class T10, + class T11, class T12, class T13> + static inline + ustring compose(const ustring& fmt, + const T1& a1, const T2& a2, const T3& a3, + const T4& a4, const T5& a5, const T6& a6, + const T7& a7, const T8& a8, const T9& a9, + const T10& a10, const T11& a11, const T12& a12, + const T13& a13); + + /* See the documentation for compose(const ustring& fmt, const T1& a1). + * @newin2p16 + */ + template <class T1, class T2, class T3, class T4, class T5, + class T6, class T7, class T8, class T9, class T10, + class T11, class T12, class T13, class T14> + static inline + ustring compose(const ustring& fmt, + const T1& a1, const T2& a2, const T3& a3, + const T4& a4, const T5& a5, const T6& a6, + const T7& a7, const T8& a8, const T9& a9, + const T10& a10, const T11& a11, const T12& a12, + const T13& a13, const T14& a14); + + /* See the documentation for compose(const ustring& fmt, const T1& a1). + * @newin2p16 + */ + template <class T1, class T2, class T3, class T4, class T5, + class T6, class T7, class T8, class T9, class T10, + class T11, class T12, class T13, class T14, class T15> + static inline + ustring compose(const ustring& fmt, + const T1& a1, const T2& a2, const T3& a3, + const T4& a4, const T5& a5, const T6& a6, + const T7& a7, const T8& a8, const T9& a9, + const T10& a10, const T11& a11, const T12& a12, + const T13& a13, const T14& a14, const T15& a15); + /*! Format the argument to its string representation. * Applies the arguments in order to an std::wostringstream and returns the * resulting string. I/O manipulators may also be used as arguments. This @@ -1405,6 +1484,185 @@ return ustring::compose_argv(fmt, G_N_ELEMENTS(argv), argv); } +template <class T1, class T2, class T3, class T4, class T5, + class T6, class T7, class T8, class T9, class T10> +inline // static +ustring ustring::compose(const ustring& fmt, + const T1& a1, const T2& a2, const T3& a3, + const T4& a4, const T5& a5, const T6& a6, + const T7& a7, const T8& a8, const T9& a9, + const T10& a10) +{ + const ustring::Stringify<T1> s1 (a1); + const ustring::Stringify<T2> s2 (a2); + const ustring::Stringify<T3> s3 (a3); + const ustring::Stringify<T4> s4 (a4); + const ustring::Stringify<T5> s5 (a5); + const ustring::Stringify<T6> s6 (a6); + const ustring::Stringify<T7> s7 (a7); + const ustring::Stringify<T8> s8 (a8); + const ustring::Stringify<T9> s9 (a9); + const ustring::Stringify<T10> s10 (a10); + + const ustring *const argv[] = { s1.ptr(), s2.ptr(), s3.ptr(), s4.ptr(), + s5.ptr(), s6.ptr(), s7.ptr(), s8.ptr(), s9.ptr(), + s10.ptr() }; + return ustring::compose_argv(fmt, G_N_ELEMENTS(argv), argv); +} + +template <class T1, class T2, class T3, class T4, class T5, + class T6, class T7, class T8, class T9, class T10, + class T11> +inline // static +ustring ustring::compose(const ustring& fmt, + const T1& a1, const T2& a2, const T3& a3, + const T4& a4, const T5& a5, const T6& a6, + const T7& a7, const T8& a8, const T9& a9, + const T10& a10, const T11& a11) +{ + const ustring::Stringify<T1> s1 (a1); + const ustring::Stringify<T2> s2 (a2); + const ustring::Stringify<T3> s3 (a3); + const ustring::Stringify<T4> s4 (a4); + const ustring::Stringify<T5> s5 (a5); + const ustring::Stringify<T6> s6 (a6); + const ustring::Stringify<T7> s7 (a7); + const ustring::Stringify<T8> s8 (a8); + const ustring::Stringify<T9> s9 (a9); + const ustring::Stringify<T10> s10 (a10); + const ustring::Stringify<T11> s11 (a11); + + const ustring *const argv[] = { s1.ptr(), s2.ptr(), s3.ptr(), s4.ptr(), + s5.ptr(), s6.ptr(), s7.ptr(), s8.ptr(), s9.ptr(), + s10.ptr(), s11.ptr() }; + return ustring::compose_argv(fmt, G_N_ELEMENTS(argv), argv); +} + +template <class T1, class T2, class T3, class T4, class T5, + class T6, class T7, class T8, class T9, class T10, + class T11, class T12> +inline // static +ustring ustring::compose(const ustring& fmt, + const T1& a1, const T2& a2, const T3& a3, + const T4& a4, const T5& a5, const T6& a6, + const T7& a7, const T8& a8, const T9& a9, + const T10& a10, const T11& a11, const T12& a12) +{ + const ustring::Stringify<T1> s1 (a1); + const ustring::Stringify<T2> s2 (a2); + const ustring::Stringify<T3> s3 (a3); + const ustring::Stringify<T4> s4 (a4); + const ustring::Stringify<T5> s5 (a5); + const ustring::Stringify<T6> s6 (a6); + const ustring::Stringify<T7> s7 (a7); + const ustring::Stringify<T8> s8 (a8); + const ustring::Stringify<T9> s9 (a9); + const ustring::Stringify<T10> s10 (a10); + const ustring::Stringify<T11> s11 (a11); + const ustring::Stringify<T12> s12 (a12); + + const ustring *const argv[] = { s1.ptr(), s2.ptr(), s3.ptr(), s4.ptr(), + s5.ptr(), s6.ptr(), s7.ptr(), s8.ptr(), s9.ptr(), + s10.ptr(), s11.ptr(), s12.ptr() }; + return ustring::compose_argv(fmt, G_N_ELEMENTS(argv), argv); +} + +template <class T1, class T2, class T3, class T4, class T5, + class T6, class T7, class T8, class T9, class T10, + class T11, class T12, class T13> +inline // static +ustring ustring::compose(const ustring& fmt, + const T1& a1, const T2& a2, const T3& a3, + const T4& a4, const T5& a5, const T6& a6, + const T7& a7, const T8& a8, const T9& a9, + const T10& a10, const T11& a11, const T12& a12, + const T13& a13) +{ + const ustring::Stringify<T1> s1 (a1); + const ustring::Stringify<T2> s2 (a2); + const ustring::Stringify<T3> s3 (a3); + const ustring::Stringify<T4> s4 (a4); + const ustring::Stringify<T5> s5 (a5); + const ustring::Stringify<T6> s6 (a6); + const ustring::Stringify<T7> s7 (a7); + const ustring::Stringify<T8> s8 (a8); + const ustring::Stringify<T9> s9 (a9); + const ustring::Stringify<T10> s10 (a10); + const ustring::Stringify<T11> s11 (a11); + const ustring::Stringify<T12> s12 (a12); + const ustring::Stringify<T13> s13 (a13); + + const ustring *const argv[] = { s1.ptr(), s2.ptr(), s3.ptr(), s4.ptr(), + s5.ptr(), s6.ptr(), s7.ptr(), s8.ptr(), s9.ptr(), + s10.ptr(), s11.ptr(), s12.ptr(), s13.ptr() }; + return ustring::compose_argv(fmt, G_N_ELEMENTS(argv), argv); +} + +template <class T1, class T2, class T3, class T4, class T5, + class T6, class T7, class T8, class T9, class T10, + class T11, class T12, class T13, class T14> +inline // static +ustring ustring::compose(const ustring& fmt, + const T1& a1, const T2& a2, const T3& a3, + const T4& a4, const T5& a5, const T6& a6, + const T7& a7, const T8& a8, const T9& a9, + const T10& a10, const T11& a11, const T12& a12, + const T13& a13, const T14& a14) +{ + const ustring::Stringify<T1> s1 (a1); + const ustring::Stringify<T2> s2 (a2); + const ustring::Stringify<T3> s3 (a3); + const ustring::Stringify<T4> s4 (a4); + const ustring::Stringify<T5> s5 (a5); + const ustring::Stringify<T6> s6 (a6); + const ustring::Stringify<T7> s7 (a7); + const ustring::Stringify<T8> s8 (a8); + const ustring::Stringify<T9> s9 (a9); + const ustring::Stringify<T10> s10 (a10); + const ustring::Stringify<T11> s11 (a11); + const ustring::Stringify<T12> s12 (a12); + const ustring::Stringify<T13> s13 (a13); + const ustring::Stringify<T14> s14 (a14); + + const ustring *const argv[] = { s1.ptr(), s2.ptr(), s3.ptr(), s4.ptr(), + s5.ptr(), s6.ptr(), s7.ptr(), s8.ptr(), s9.ptr(), + s10.ptr(), s11.ptr(), s12.ptr(), s13.ptr(), s14.ptr() }; + return ustring::compose_argv(fmt, G_N_ELEMENTS(argv), argv); +} + +template <class T1, class T2, class T3, class T4, class T5, + class T6, class T7, class T8, class T9, class T10, + class T11, class T12, class T13, class T14, class T15> +inline // static +ustring ustring::compose(const ustring& fmt, + const T1& a1, const T2& a2, const T3& a3, + const T4& a4, const T5& a5, const T6& a6, + const T7& a7, const T8& a8, const T9& a9, + const T10& a10, const T11& a11, const T12& a12, + const T13& a13, const T14& a14, const T15& a15) +{ + const ustring::Stringify<T1> s1 (a1); + const ustring::Stringify<T2> s2 (a2); + const ustring::Stringify<T3> s3 (a3); + const ustring::Stringify<T4> s4 (a4); + const ustring::Stringify<T5> s5 (a5); + const ustring::Stringify<T6> s6 (a6); + const ustring::Stringify<T7> s7 (a7); + const ustring::Stringify<T8> s8 (a8); + const ustring::Stringify<T9> s9 (a9); + const ustring::Stringify<T10> s10 (a10); + const ustring::Stringify<T11> s11 (a11); + const ustring::Stringify<T12> s12 (a12); + const ustring::Stringify<T13> s13 (a13); + const ustring::Stringify<T14> s14 (a14); + const ustring::Stringify<T15> s15 (a15); + + const ustring *const argv[] = { s1.ptr(), s2.ptr(), s3.ptr(), s4.ptr(), + s5.ptr(), s6.ptr(), s7.ptr(), s8.ptr(), s9.ptr(), + s10.ptr(), s11.ptr(), s12.ptr(), s13.ptr(), s14.ptr(), s15.ptr() }; + return ustring::compose_argv(fmt, G_N_ELEMENTS(argv), argv); +} + #endif /* DOXYGEN_SHOULD_SKIP_THIS */
Daniel, what do you think?
Do you have a real-world need for 9 parameters?
(In reply to comment #2) > Do you have a real-world need for 9 parameters? > Yes, I have. It is a complex log message. I can understand that you don't want to support this kind usage, but I looked it good to create this patch.
I'd like to see an example of how you are using it. It doesn't sound like something that would be fun to translate anyway.
The patch cannot possibly work: We use qt-format syntax for the format string placeholders, which limits the maximum number of arguments to nine. Closing.