Skip to content

Instantly share code, notes, and snippets.

@mazgi
Created March 15, 2013 09:27
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mazgi/5168590 to your computer and use it in GitHub Desktop.
Save mazgi/5168590 to your computer and use it in GitHub Desktop.
c++で型取得してみる
#include <iostream>
#include <cxxabi.h>
template<class T>
void func(const T& t)
{
int status;
std::cout << "["
<< t << "]["
<< typeid(t).name() << "]["
<< abi::__cxa_demangle(typeid(t).name(), 0, 0, &status)
<< "]" << std::endl;
}
template<class First, class... Rest>
void func(const First& first, const Rest&... rest)
{
func(first);
func(rest...);
}
int main(int argc, const char * argv[])
{
func(1, 2, 0.0,
"", 'a', NULL,
"abc", "bcd", "bcd", "bcde",
std::string("str"), std::string("str"), std::string("str2"));
return 0;
}
@mazgi
Copy link
Author

mazgi commented Mar 15, 2013

結果

[1][i][int]
[2][i][int]
[0][d][double]
[][A1_c][char [1]]
[a][c][char]
[0][l][long]
[abc][A4_c][char [4]]
[bcd][A4_c][char [4]]
[bcd][A4_c][char [4]]
[bcde][A5_c][char [5]]
[str][NSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE][std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >]
[str][NSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE][std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >]
[str2][NSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE][std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >]

@mazgi
Copy link
Author

mazgi commented Mar 19, 2013

memo

    void func()
    {
        std::cout << __PRETTY_FUNCTION__ << std::endl;
    }
    template<class First>
    void func(const First &f)
    {
        std::cout << __PRETTY_FUNCTION__ << std::endl;
    }
    template<class First, class ... Args>
    void func(const First &f, const Args & ... args)
    {
        std::cout << __PRETTY_FUNCTION__ << std::endl;
        func(f);
        func(args ...);
    }

    template<class ... Args>
    void q(const Args & ... args)
    {
        std::cout << __PRETTY_FUNCTION__ << std::endl;
        func(args...);
    }
        q();
        q("a", 1, "c");

@mazgi
Copy link
Author

mazgi commented Mar 19, 2013

char* を無理矢理判別するなら↓で一応できるっぽい。

                const char *CharArrayName = "char [";
                int status = 0;
                char *demangled = demangle__(typeid(value).name(), status);
                if (status == 0) {
                    if (strncmp(CharArrayName, demangled, strlen(CharArrayName)) == 0) {
                      // char*
                    }
                }
                free(demangled);

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment