Need help with nameof?
Click the “chat” button below for chat support from the developer who created it, or find similar developers for support.

About the developer

Neargye
1.1K Stars 59 Forks MIT License 481 Commits 1 Opened issues

Description

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

Services available

!
?

Need anything else?

Contributors list

# 13,817
cpp17
Tensorf...
Git
cpluspl...
445 commits
# 251,997
cpp17
cpluspl...
cpluspl...
c-plus-...
18 commits
# 71,249
cpp17
Qt
raytrac...
cg
1 commit
# 90,171
Shell
google-...
google-...
cpp17
1 commit
 _   _                             __    _____
| \ | |                           / _|  / ____|_     _
|  \| | __ _ _ __ ___   ___  ___ | |_  | |   _| |_ _| |_
| . ` |/ _` | '_ ` _ \ / _ \/ _ \|  _| | |  |_   _|_   _|
| |\  | (_| | | | | | |  __/ (_) | |   | |____|_|   |_|
|_| \_|\__,_|_| |_| |_|\___|\___/|_|    \_____|

Github releases Conan package Vcpkg package License Try online Compiler explorer

Nameof C++

Header-only C++17 library provides nameof macros and functions to simply obtain the name of a variable, type, function, macro, and enum.

Features

  • C++17
  • Header-only
  • Dependency-free
  • Compile-time
  • Name of variable, member variable
  • Name of type, variable type
  • Name of function, member function
  • Name of enum, enum variable
  • Name of macro
  • Enum to string

Documentation

Examples

  • Nameof
  // Name of variable.
  NAMEOF(somevar) -> "somevar"

// Name of member variable. NAMEOF(person.address.zip_code) -> "zip_code"

// Name of function. NAMEOF(foo()) -> "foo"

// Name of member function. NAMEOF(somevar.some_method()) -> "some_method" NAMEOF(somevar.some_method()) -> "some_method"

// Name of macro. NAMEOF(LINE) -> "LINE" NAMEOF(NAMEOF(structvar)) -> "NAMEOF"

  • Nameof enum
  enum class Color { RED = 1, BLUE = 2, GREEN = 4 };

auto color = Color::RED; // Name of enum variable. NAMEOF_ENUM(color) -> "RED" nameof::nameof_enum(color) -> "RED"

// Static storage enum variable to string. // This version is much lighter on the compile times and is not restricted to the enum_range limitation. NAMEOF_ENUM_CONST(Color::GREEN) -> "GREEN" nameof::nameof_enum<:green>() -> "GREEN"

// Enum flag variable to string. NAMEOF_ENUM_FLAG(Color::GREEN | Color::BLUE) -> "GREEN|BLUE" nameof::nameof_enum_flag<:green>() -> "GREEN|BLUE" </:green></:green>

  • Nameof type
  const my::detail::SomeClass& var_ref = var;
  // Name of variable type.
  NAMEOF_TYPE_EXPR(var_ref) -> "my::detail::SomeClass"
  nameof::nameof_type() -> "my::detail::SomeClass"
  NAMEOF_FULL_TYPE_EXPR(var_ref) -> "const my::detail::SomeClass&"
  nameof::nameof_full_type() -> "const my::detail::SomeClass&"
  NAMEOF_SHORT_TYPE_EXPR(var_ref) -> "SomeClass"
  nameof::nameof_short_type() -> "SomeClass"

using T = const my::detail::SomeClass&; // Name of type. NAMEOF_TYPE(T) ->"my::detail::SomeClass" nameof::nameof_type() -> "my::detail::SomeClass" NAMEOF_FULL_TYPE(T) -> "const my::detail::SomeClass&" nameof::nameof_full_type() -> "const my::detail::SomeClass&" NAMEOF_SHORT_TYPE(T) -> "SomeClass" nameof::nameof_short_type() -> "SomeClass"

my::detail::Base* ptr = new my::detail::Derived(); // Name of type, using rtti. NAMEOF_TYPE_RTTI(*ptr) -> "my::detail::Derived" NAMEOF_FULL_TYPE_RTTI(*ptr) -> "volatile const my::detail::Derived&" NAMEOF_SHORT_TYPE_RTTI(*ptr) -> "Derived"

  • Compile-time
  constexpr auto somevar_name = NAMEOF(somevar);
  // somevar_name -> "somevar"
  constexpr auto color_name = NAMEOF_ENUM(Color::BLUE); // or nameof::nameof_enum(Color::BLUE)
  // color_name -> "BLUE"
  constexpr auto var_type_name = NAMEOF_TYPE_EXPR(var); // or nameof::nameof_type()
  // var_type_name -> "int"
  constexpr auto type_name = NAMEOF_TYPE(T); // or nameof::nameof_type()
  // type_name -> "int"

Remarks

Integration

You should add required file nameof.hpp.

If you are using vcpkg on your project for external dependencies, then you can use the nameof package.

If you are using Conan to manage your dependencies, merely add

nameof/x.y.z
to your conan's requires, where
x.y.z
is the release version you want to use.

Archlinux users can install

nameof
by package manager AUR, using the following command:
yay -S nameof
.

Alternatively, you can use something like CPM which is based on CMake's

Fetch_Content
module.
CPMAddPackage(
    NAME nameof
    GITHUB_REPOSITORY Neargye/nameof
    GIT_TAG x.y.z # Where `x.y.z` is the release version you want to use.
)

Compiler compatibility

  • Clang/LLVM >= 5
  • MSVC++ >= 14.11 / Visual Studio >= 2017
  • Xcode >= 10
  • GCC >= 7 (GCC >= 9 for NAMEOF_ENUM)

Licensed under the MIT License

We use cookies. If you continue to browse the site, you agree to the use of cookies. For more information on our use of cookies please see our Privacy Policy.