The attached document was submitted for publication to C/C++ Users Journal
today, but I thought it might be worth submitting to Boost as well.

Perhaps my spelling class template could be folded into type_traits?

Robert Allan Schwartz
Have you ever wished you could convert a template parameter to a std::std::string,
in something like the following:

        template <typename T>
        void foo(T)
        {
                cout << "T is " << /* convert T to std::string */ << endl;
        }

Now you can!

First, create a primary template:

        #include <string>

        // primary template:

        template <typename T>
        class spelling;

Second, create partial specializations for pointers and references to T:

        // partial specialization for T *:

        template <typename T>
        class spelling<T *>
        {
        public:
                static const std::string result;
        };

        template <typename T>
        const std::string spelling<T *>::result = spelling<T>::result + " *";

        // partial specialization for T * const:

        template <typename T>
        class spelling<T * const>
        {
        public:
                static const std::string result;
        };

        template <typename T>
        const std::string spelling<T * const>::result = spelling<T>::result + " * 
const";

        // partial specialization for T const *:

        template <typename T>
        class spelling<T const *>
        {
        public:
                static const std::string result;
        };

        template <typename T>
        const std::string spelling<T const *>::result = spelling<T>::result + " const 
*";

        // partial specialization for T const * const:

        template <typename T>
        class spelling<T const * const>
        {
        public:
                static const std::string result;
        };

        template <typename T>
        const std::string spelling<T const * const>::result = spelling<T>::result + " 
const * const";

        // partial specialization for T &:

        template <typename T>
        class spelling<T &>
        {
        public:
                static const std::string result;
        };

        template <typename T>
        const std::string spelling<T &>::result = spelling<T>::result + " &";

        // partial specialization for T const &:

        template <typename T>
        class spelling<T const &>
        {
        public:
                static const std::string result;
        };

        template <typename T>
        const std::string spelling<T const &>::result = spelling<T>::result + " const 
&";

Third, create partial specializations for all the primitive types:

        // full specialization for unsigned char:

        template <>
        class spelling<unsigned char>
        {
        public:
                static const std::string result;
        };

        const std::string spelling<unsigned char>::result = "unsigned char";

        // full specialization for unsigned short:

        template <>
        class spelling<unsigned short>
        {
        public:
                static const std::string result;
        };

        const std::string spelling<unsigned short>::result = "unsigned short";

        // full specialization for unsigned int:

        template <>
        class spelling<unsigned int>
        {
        public:
                static const std::string result;
        };

        const std::string spelling<unsigned int>::result = "unsigned int";

        // full specialization for unsigned long:

        template <>
        class spelling<unsigned long>
        {
        public:
                static const std::string result;
        };

        const std::string spelling<unsigned long>::result = "unsigned long";

        // full specialization for signed char:

        template <>
        class spelling<signed char>
        {
        public:
                static const std::string result;
        };

        const std::string spelling<signed char>::result = "signed char";

        // full specialization for signed short:

        template <>
        class spelling<signed short>
        {
        public:
                static const std::string result;
        };

        const std::string spelling<signed short>::result = "signed short";

        // full specialization for signed int:

        template <>
        class spelling<signed int>
        {
        public:
                static const std::string result;
        };

        const std::string spelling<signed int>::result = "signed int";

        // full specialization for signed long:

        template <>
        class spelling<signed long>
        {
        public:
                static const std::string result;
        };

        const std::string spelling<signed long>::result = "signed long";

        // full specialization for bool:

        template <>
        class spelling<bool>
        {
        public:
                static const std::string result;
        };

        const std::string spelling<bool>::result = "bool";

        // full specialization for char:

        template <>
        class spelling<char>
        {
        public:
                static const std::string result;
        };

        const std::string spelling<char>::result = "char";

        // full specialization for wchar_t:

        template <>
        class spelling<wchar_t>
        {
        public:
                static const std::string result;
        };

        const std::string spelling<wchar_t>::result = "wchar_t";

Fourth, create your own types (enums, structs, classes, unions):

        // add your types here:

        enum my_enum { ENUM1, ENUM2, ENUM3 };

        struct my_struct
        {
        };

        class my_class
        {
        };

        union my_union
        {
        };

Fifth, create full specializations for your own types:

        // full specialization for my_enum:

        template <>
        class spelling<my_enum>
        {
        public:
                static const std::string result;
        };

        const std::string spelling<my_enum>::result = "enum my_enum";

        // full specialization for my_struct:

        template <>
        class spelling<my_struct>
        {
        public:
                static const std::string result;
        };

        const std::string spelling<my_struct>::result = "struct my_struct";

        // full specialization for my_class:

        template <>
        class spelling<my_class>
        {
        public:
                static const std::string result;
        };

        const std::string spelling<my_class>::result = "class my_class";

        // full specialization for my_union:

        template <>
        class spelling<my_union>
        {
        public:
                static const std::string result;
        };

        const std::string spelling<my_union>::result = "union my_union";

Last, but not least, use the spelling class template to convert T to a std::string:

        template <typename T>
        void foo(T)
        {
                cout << "T is " << spelling<T>::result << endl;
        }

        int main()
        {
                foo(3);
                foo(ENUM1);
                foo(my_struct());
                foo(my_class());
                foo(my_union());
                foo(new int);

                return 0;
        }

Voila!

Copyright © 2003 Robert Allan Schwartz. All rights reserved.
_______________________________________________
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost

Reply via email to