Nameof fork with modules for modern C++, simply obtain the name of a variable, type, function, macro, and enum
Find a file
2019-03-26 15:00:48 +05:00
example fix example 2019-03-25 14:26:55 +05:00
include v0.7.3 2019-03-26 14:14:52 +05:00
test fix warning 2019-03-26 12:54:48 +05:00
.appveyor.yml wip v0.6.0 2019-03-20 21:41:51 +05:00
.gitignore v0.2.3 2018-04-19 01:31:32 +05:00
.travis.yml update ci 2019-03-26 14:56:43 +05:00
CMakeLists.txt v0.7.3 2019-03-26 14:14:52 +05:00
LICENSE wip v0.6.0 2019-03-20 21:41:51 +05:00
README.md update readme 2019-03-26 15:00:48 +05:00

Nameof C++

 _   _                             __    _____
| \ | |                           / _|  / ____|_     _
|  \| | __ _ _ __ ___   ___  ___ | |_  | |   _| |_ _| |_
| . ` |/ _` | '_ ` _ \ / _ \/ _ \|  _| | |  |_   _|_   _|
| |\  | (_| | | | | | |  __/ (_) | |   | |____|_|   |_|
|_| \_|\__,_|_| |_| |_|\___|\___/|_|    \_____|
Branch Linux/OSX Windows License Codacy
master Build Status Build status License Codacy Badge

What is Nameof?

Header-only C++17 library provides nameof macros and functions to obtain simple name of 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

Examples

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

constexpr auto cx_name = NAMEOF(somevar);
static_assert("somevar" == cx_name);
  • Name of function
// Name of function
NAMEOF(some_method<int, float>) -> "some_method"
NAMEOF_FULL(some_method<int, float>) -> "some_method<int, float>"
// Name of member function
NAMEOF(somevar.foo()) -> "foo"
NAMEOF_FULL(somevar.boo<int>()) -> "boo<int>"

constexpr auto cx_name = NAMEOF(somevar.foo());
static_assert("foo" == cx_name);
  • Name of enum
auto c = Color::RED;
// Name of enum variable
NAMEOF_ENUM(c) -> "RED"
// Name of enum variable
nameof::nameof_enum(c) -> "RED"

constexpr auto cx_color = Color::BLUE;
// Name of static storage enum variable
nameof::nameof_enum<cx_color>() -> "BLUE"
  • Name of type
// Name of variable type
NAMEOF_TYPE(Color::RED) -> "Color"
// Name of type
NAMEOF_TYPE_T(int) -> "int"
// Name of variable type
nameof::nameof_type<decltype(Color::RED)>() -> "Color"
// Name of type
nameof::nameof_type<int>() -> "int"

constexpr auto cx_name = NAMEOF_TYPE(Color::RED);
static_assert("Color" == cx_name);
  • Name of macro
// Name of macro
NAMEOF(__LINE__) -> "__LINE__"

constexpr auto cx_name = NAMEOF(__LINE__);
static_assert("__LINE__" == cx_name);

Remarks

  • Nameof return std::string_view.

  • Nameof expression arguments are identified, but do not evaluated.

  • NAMEOF_ENUM supported on the GCC >= 9.

  • If you need of raw fully-qualified name, use NAMEOF_RAW.

NAMEOF_RAW(somevar.somefield) -> "somevar.somefield"
NAMEOF_RAW(&SomeStruct::SomeMethod) -> "&SomeStruct::SomeMethod"
NAMEOF_RAW(std::string) -> "std::string"
  • Spaces and Tabs ignored
NAMEOF(   somevar   ) -> "somevar"
NAMEOF(	somevar	) -> "somevar"

Integration

You have to add required file nameof.hpp.

Compiler compatibility

  • Clang/LLVM >= 5
  • Visual C++ >= 15.3 / Visual Studio >= 2017
  • Xcode >= 9
  • GCC >= 7

Licensed under the MIT License