Nameof fork with modules for modern C++, simply obtain the name of a variable, type, function, macro, and enum
Find a file
2018-09-02 00:14:11 +05:00
example add nameof enum 2018-09-01 18:28:15 +05:00
include clean-up 2018-09-02 00:14:11 +05:00
test fix test 2018-09-01 22:19:33 +05:00
.appveyor.yml update ci 2018-08-24 20:20:26 +05:00
.gitignore v0.2.3 2018-04-19 01:31:32 +05:00
.travis.yml update ci 2018-08-24 20:20:26 +05:00
CMakeLists.txt update build 2018-08-29 16:57:44 +05:00
LICENSE v0.2.3 2018-04-19 01:31:32 +05:00
README.md add nameof enum 2018-09-01 18:28:15 +05:00

Nameof C++

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

Used to obtain the simple name of a variable, type, member, function, macros. 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++11
  • 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

Examples

  • A nameof macros expression has this form
// Name of variable
NAMEOF(somevar) -> "somevar"
// Name of member
NAMEOF(person.address.zip_code) -> "zip_code"
// Name of function
NAMEOF(SomeMethod<int, float>) -> "SomeMethod"
NAMEOF_FULL(SomeMethod<int, float>) -> "SomeMethod4<int, float>"
// Name of enum
NAMEOF(SomeEnum::RED) -> "RED"
SomeEnum e = SomeEnum::RED;
NAMEOF_ENUM(e) -> "RED"
// Name of type
NAMEOF_TYPE(SomeEnum::RED) -> "SomeEnum"
NAMEOF_TYPE_T(int) -> "int"
// Name of macros
NAMEOF(__LINE__) -> "__LINE__"
  • Constexpr
constexpr auto cx = NAMEOF(somevar); -> "somevar"
static_assert(cx == "somevar", "Wrong name!");
  • Compilation check
NAMEOF_TYPE_T(std::stringgg) -> error namespace "std" has no member "stringgg"
  • Validate parameters
void f(char* s) {
  if (s == nullptr)
    throw std::invalid_argument(NAMEOF(s).apend("with type = ").apend(NAMEOF_TYPE(s)));
}
  • Serialization, for example json:
void to_json(json& j, const person& p) {
  j = json{{NAMEOF(p.name), p.name},
           {NAMEOF(p.address), p.address},
           {NAMEOF(p.age), p.age}};
}

void from_json(const json& j, person& p) {
  p.name =    j.at(NAMEOF(p.name));
  p.address = j.at(NAMEOF(p.address));
  p.age =     j.at(NAMEOF(p.age));
}
  • Logging
template <typename T>
void f() {
  Log(NAMEOF(f) + " method entry with T = " + NAMEOF_TYPE_T(T));
}

Remarks

  • 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"
  • Spaces and Tabs ignored
NAMEOF(   somevar   ) -> "somevar"
NAMEOF(	somevar	) -> "somevar"

Integration

You should add required file nameof.hpp and switch to C++11.

Compiler compatibility

  • GCC
  • Clang
  • MSVC

Licensed under the MIT License