Nameof fork with modules for modern C++, simply obtain the name of a variable, type, function, macro, and enum
Find a file
2018-04-10 23:09:23 +05:00
example v0.2.1 2018-04-05 17:58:52 +05:00
include ctti workaround 2018-04-10 23:09:23 +05:00
test v0.2.1 2018-04-05 17:58:52 +05:00
.appveyor.yml change build settings 2018-04-09 17:31:07 +05:00
.gitignore clean-up 2018-04-06 02:30:39 +05:00
.travis.yml change build settings 2018-04-09 17:31:07 +05:00
CMakeLists.txt change build settings 2018-04-09 17:31:07 +05:00
LICENSE license 2018-04-07 03:20:04 +05:00
README.md v0.2.1 2018-04-05 17:58:52 +05:00

nameof() c++11

C++ alternative to nameof operator in C#.

Branch Linux/OSX Windows
master Build Status Build status

Used to obtain the simple name of a variable, type, member or function and etc. 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.

A nameof macros expression has this form:

std::cout << NAMEOF(person.address.zip_code) << std::endl; // prints "zip_code"

Features

  • Simple name
  • C++11
  • Header-only
  • Dependency-free
  • Compile-time
  • Compilation check

Example & Key Use Cases

  • Name of a variable, member or function and etc
NAMEOF(someVar) -> "someVar"
NAMEOF(someVar.SomeField) -> "SomeField"

NAMEOF(someVar.SomeMethod1()) -> "SomeMethod1()"
NAMEOF(&SomeStruct::SomeMethod2) -> "SomeMethod2"
  • Name of enum
NAMEOF(SomeEnum::RED) -> "RED"
NAMEOF(SomeEnum::GREEN) -> "GREEN"
  • Name of type
NAMEOF(int[]) -> "int[]"
NAMEOF(std::string) -> "string"
  • Constexpr
void f() {
  int i;
  constexpr auto constexpr_work_fine = NAMEOF(i); -> "i"
}
  • Compilation check
void f() {
  int i;
  NAMEOF(i); -> "i"
  NAMEOF(iii); -> error identifier "iii" is undefined
  NAMEOF(std::stringgg) -> error namespace "std" has no member "stringgg"
}
  • Validate parameters
void f(char* s) {
  if (s == nullptr)
    throw std::invalid_argument(NAMEOF(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
void f() {
  Log(NAMEOF(f), " method entry");
}

Remarks

  • If you need to get the fully-qualified name, you could use the NAMEOF_FULL().
NAMEOF_FULL(someVar.SomeField) -> "someVar.SomeField"
NAMEOF_FULL(&SomeStruct::SomeMethod2) -> "&SomeStruct::SomeMethod2"
NAMEOF_FULL(std::string) -> "std::string"
  • By default nameof work with RTTI, but can work without RTTI. If compiling without RTTI, you need use the NAMEOF_TYPE() for get name of type.
NAMEOF_TYPE(int[]) -> "int[]"
NAMEOF_TYPE(std::string) -> "string"

NAMEOF_TYPE_FULL(std::string) -> "std::string"

License MIT