Skip to content

LongJohnCoder/nameof

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Nameof C++

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

What is Nameof?

A header only C++17 library provides nameof macros and functions to obtain the simple name of a variable, type, member, function, macros and enum.

Before, you had to use string literals to refer to definitions, which is brittle when renaming code elements because tools do not know to check these string literals.

Features

  • C++17
  • Header-only
  • Dependency-free
  • Compile-time
  • Compilation check
  • Name of variable
  • Name of member
  • Name of function
  • Name of emum
  • Name of macrose
  • Name of type
  • Name of variable and member
// Name of variable
NAMEOF(somevar) -> "somevar"
// Name of member
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(somevar.boo<int>() -> "boo<int>"

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

constexpr auto cx_name = NAMEOF_ENUM(c);
static_assert("RED" == cx_name);
  • Name of type
// Name of variable type
NAMEOF_TYPE(Color::RED) -> "Color"
// Name of type
NAMEOF_TYPE_T(int) -> "int"
// Name of variable type function
nameof::nameof_type(Color::RED) -> "Color"
// Name of type function
nameof::nameof_type<int> -> "int"

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

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

Remarks

  • Nameof return std::string_view.

  • The argument expression identifies a code definition, but it is never evaluated.

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

NAMEOF_RAW(somevar.somefield) -> "somevar.somefield"
NAMEOF_RAW(&SomeStruct::SomeMethod) -> "&SomeStruct::SomeMethod"
  • NAMEOF_ENUM does not work on the GCC.
auto c = Color::RED;
NAMEOF_ENUM(c) -> "(Color)0"
nameof::nameof_enum(c) -> "(Color)0"
  • Spaces and Tabs ignored
NAMEOF(   somevar   ) -> "somevar"
NAMEOF(	somevar	) -> "somevar"

Integration

You should add required file nameof.hpp.

Compiler compatibility

  • GCC
  • Clang
  • MSVC

Licensed under the MIT License

About

Nameof operator for modern C++

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • C++ 91.4%
  • CMake 8.6%