Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

606 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

GitHub releases Conan package vcpkg package License Compiler explorer

Nameof C++

A header-only C++17 library that provides nameof macros and functions for obtaining the name of a variable, type, function, macro, or enum.

Documentation

  • Nameof

    // Name of variable.
    NAMEOF(somevar) -> "somevar"
    
    // Name of member variable.
    NAMEOF(person.address.zip_code) -> "zip_code"
    
    // Name of function.
    NAMEOF(foo<int, float>()) -> "foo"
    
    // Name of member function.
    NAMEOF(somevar.some_method()) -> "some_method"
    NAMEOF(somevar.some_method<int>()) -> "some_method"
    
    // Name of macro.
    NAMEOF(__LINE__) -> "__LINE__"
    
    // Obtains full name of variable, function, macro.
    NAMEOF_FULL(somevar.some_method<int>()) -> "some_method<int>"
    
    // Obtains raw expression text.
    NAMEOF_RAW(somevar.some_method<int>()) -> "somevar.some_method<int>()"
  • Nameof enum

    enum class Color { RED = 1, BLUE = 2, GREEN = 4 };
    
    auto color = Color::RED;
    // Name of enum value.
    NAMEOF_ENUM(color) -> "RED"
    nameof::nameof_enum(color) -> "RED"
    
    // Name of enum value known at compile time.
    // This version has a lower compile-time cost and is not restricted by the enum_range limitation.
    NAMEOF_ENUM_CONST(Color::GREEN) -> "GREEN"
    nameof::nameof_enum<Color::GREEN>() -> "GREEN"
    
    enum AnimalFlags { HasClaws = 1, CanFly = 2, EatsFish = 4 };
    
    // Enum flag value to string.
    auto flag = static_cast<AnimalFlags>(CanFly | EatsFish);
    NAMEOF_ENUM_FLAG(flag) -> "CanFly|EatsFish"
    nameof::nameof_enum_flag(flag, '$') -> "CanFly$EatsFish"
    
    // Obtains name of enum value or default value if no name is available.
    NAMEOF_ENUM_OR(Color::GREEN, "none") -> "GREEN"
    NAMEOF_ENUM_OR((Color)0, "none") -> "none"
    nameof::nameof_enum_or(Color::GREEN, "none") -> "GREEN"
  • Nameof type

    Exact type spellings are compiler-specific.

    const my::detail::SomeClass<int>& var_ref = var;
    // Name of variable type.
    NAMEOF_TYPE_EXPR(var_ref) -> "my::detail::SomeClass<int>"
    nameof::nameof_type<decltype(var_ref)>() -> "my::detail::SomeClass<int>"
    NAMEOF_FULL_TYPE_EXPR(var_ref) -> "const my::detail::SomeClass<int>&"
    nameof::nameof_full_type<decltype(var_ref)>() -> "const my::detail::SomeClass<int>&"
    NAMEOF_SHORT_TYPE_EXPR(var_ref) -> "SomeClass"
    nameof::nameof_short_type<decltype(var_ref)>() -> "SomeClass"
    
    using T = const my::detail::SomeClass<int>&;
    // Name of type.
    NAMEOF_TYPE(T) -> "my::detail::SomeClass<int>"
    nameof::nameof_type<T>() -> "my::detail::SomeClass<int>"
    NAMEOF_FULL_TYPE(T) -> "const my::detail::SomeClass<int>&"
    nameof::nameof_full_type<T>() -> "const my::detail::SomeClass<int>&"
    NAMEOF_SHORT_TYPE(T) -> "SomeClass"
    nameof::nameof_short_type<T>() -> "SomeClass"
    
    my::detail::Base* ptr = new my::detail::Derived();
    // Obtains type name using RTTI.
    NAMEOF_TYPE_RTTI(*ptr) -> "my::detail::Derived"
    NAMEOF_FULL_TYPE_RTTI(*ptr) -> "my::detail::Derived&"
    NAMEOF_SHORT_TYPE_RTTI(*ptr) -> "Derived"
    
    struct A {
      int this_is_the_name;
    };
    // Obtains name of member.
    NAMEOF_MEMBER(&A::this_is_the_name) -> "this_is_the_name"
    nameof::nameof_member<&A::this_is_the_name>() -> "this_is_the_name"
    
    int someglobalvariable = 0;
    const int someglobalconstvariable = 42;
    // Obtains name of a function, a global or class static variable.
    NAMEOF_POINTER(&someglobalconstvariable) -> "someglobalconstvariable"
    nameof::nameof_pointer<&someglobalconstvariable>() -> "someglobalconstvariable"
    
    constexpr auto global_ptr = &someglobalvariable;
    NAMEOF_POINTER(global_ptr) -> "someglobalvariable"
    nameof::nameof_pointer<global_ptr>() -> "someglobalvariable"

Integration

  • Single header: add nameof.hpp to your project.

  • CMake package:

    find_package(nameof CONFIG REQUIRED)
    target_link_libraries(your_target PRIVATE nameof::nameof)
  • vcpkg: install the nameof package with vcpkg install nameof.

  • Conan: add nameof/x.y.z to the requires section, where x.y.z is the required release version.

  • AUR: install nameof with an AUR helper, for example yay -S nameof.

  • CPM:

    CPMAddPackage(
        NAME nameof
        GITHUB_REPOSITORY Neargye/nameof
        GIT_TAG vx.y.z # Replace `x.y.z` with the release version you want to use.
    )

Compiler compatibility

nameof requires C++17 or newer and supports:

  • Clang/LLVM >= 5
  • GCC >= 9
  • Visual Studio >= 2017

See the reference for feature-specific requirements.

Licensed under the MIT License

About

Nameof operator for modern C++, simply obtain the name of a variable, type, function, macro, and enum

Topics

Resources

Stars

2.4k stars

Watchers

35 watching

Forks

Releases

Packages

Used by

Contributors

Languages