diff --git a/example/example.cpp b/example/example.cpp index 0ebce71..fc23f72 100644 --- a/example/example.cpp +++ b/example/example.cpp @@ -28,9 +28,15 @@ struct SomeStruct { int SomeField; - void SomeMethod() { std::cout << "No called!" << std::endl; } + void SomeMethod1() { std::cout << "No called!" << std::endl; } + int SomeMethod2() { + std::cout << "No called!" << std::endl; + return 1; + } }; +void SomeMethod3() { std::cout << "No called!" << std::endl; } + struct Long { struct LL { int LLLField; @@ -47,34 +53,43 @@ int someVar = 0; int main() { SomeStruct someVar{1}; Long otherVar{2}; - int innValue{3}; + int intValue{3}; SomeStruct* ptrVar = &someVar; SomeStruct** ptrptrVar = &ptrVar; - constexpr auto constexpr_work_fine = NAMEOF_VAR(innValue); - std::cout << constexpr_work_fine << std::endl; + constexpr auto constexpr_work_fine = NAMEOF(intValue); + std::cout << constexpr_work_fine << std::endl; // intValue + + std::cout << NAMEOF(someVar) << std::endl; // someVar + std::cout << NAMEOF(someVar.SomeField) << std::endl; // SomeField + std::cout << NAMEOF((&someVar)->SomeField) << std::endl; // SomeField + std::cout << NAMEOF(::someVar) << std::endl; // someVar + std::cout << NAMEOF(otherVar.LLField.LLLField) << std::endl; // LLLField + std::cout << NAMEOF(&someVar) << std::endl; // someVar + std::cout << NAMEOF(ptrVar) << std::endl; // ptrVar + std::cout << NAMEOF(*ptrVar) << std::endl; // ptrVar + std::cout << NAMEOF(ptrptrVar) << std::endl; // ptrptrVar + std::cout << NAMEOF(*ptrptrVar) << std::endl; // ptrptrVar + std::cout << NAMEOF(**ptrptrVar) << std::endl; // ptrptrVar + std::cout << NAMEOF(+intValue) << std::endl; // intValue + std::cout << NAMEOF(-intValue) << std::endl; // intValue + std::cout << NAMEOF(~intValue) << std::endl; // intValue + std::cout << NAMEOF(!intValue) << std::endl; // intValue + std::cout << NAMEOF(someVar.SomeMethod1()) << std::endl; // SomeMethod1() + std::cout << NAMEOF(&someVar.SomeMethod2) << std::endl; // SomeMethod2 + std::cout << NAMEOF(SomeMethod3) << std::endl; // SomeMethod3 std::cout << NAMEOF_TYPE(int[]) << std::endl; // int[] std::cout << NAMEOF_TYPE(SomeStruct) << std::endl; // SomeStruct std::cout << NAMEOF_TYPE(Long::LL) << std::endl; // LL - std::cout << NAMEOF_FUN(someVar.SomeMethod()) << std::endl; // SomeMethod() + std::cout << NAMEOF_FUN(someVar.SomeMethod1()) << std::endl; // SomeMethod1() + std::cout << NAMEOF_FUN(&someVar.SomeMethod2) << std::endl; // SomeMethod2 + std::cout << NAMEOF_FUN(SomeMethod3) << std::endl; // SomeMethod3 - std::cout << NAMEOF_VAR(someVar) << std::endl; // someVar std::cout << NAMEOF_VAR(someVar.SomeField) << std::endl; // SomeField std::cout << NAMEOF_VAR((&someVar)->SomeField) << std::endl; // SomeField std::cout << NAMEOF_VAR(::someVar) << std::endl; // someVar - std::cout << NAMEOF_VAR(&SomeStruct::SomeMethod) << std::endl; // SomeMethod - std::cout << NAMEOF_VAR(otherVar.LLField.LLLField) << std::endl; // LLLField - std::cout << NAMEOF_VAR(&someVar) << std::endl; // someVar - std::cout << NAMEOF_VAR(ptrVar) << std::endl; // ptrVar - std::cout << NAMEOF_VAR(*ptrVar) << std::endl; // ptrVar - std::cout << NAMEOF_VAR(ptrptrVar) << std::endl; // ptrptrVar - std::cout << NAMEOF_VAR(*ptrptrVar) << std::endl; // ptrptrVar - std::cout << NAMEOF_VAR(**ptrptrVar) << std::endl; // ptrptrVar - std::cout << NAMEOF_VAR(+innValue) << std::endl; // innValue - std::cout << NAMEOF_VAR(-innValue) << std::endl; // innValue - std::cout << NAMEOF_VAR(~innValue) << std::endl; // innValue - std::cout << NAMEOF_VAR(!innValue) << std::endl; // innValue - std::cout << NAMEOF_VAR(TestRValue()) << std::endl; // TestRValue() + + return 0; } \ No newline at end of file diff --git a/src/nameof.hpp b/src/nameof.hpp index 327a626..c0275e5 100644 --- a/src/nameof.hpp +++ b/src/nameof.hpp @@ -24,7 +24,9 @@ #pragma once #include -inline constexpr const char* template_nameof(const char* name, const size_t length) { +#define NAMEOF_RAW(x) (#x) + +inline constexpr const char* nameof(const char* name, const size_t length) { return length == 0 ? name : (name[length - 1] == ' ' || name[length - 1] == '.' || name[length - 1] == '>' || name[length - 1] == ':' || @@ -32,28 +34,19 @@ inline constexpr const char* template_nameof(const char* name, const size_t leng name[length - 1] == '+' || name[length - 1] == '~' || name[length - 1] == '-' || name[length - 1] == '!') ? &name[length] - : template_nameof(name, length - 1); + : nameof(name, length - 1); } -#define NAMEOF(x) #x +// Used to obtain the string name of a variable, function and etc. +template +inline constexpr const char* template_nameof(const char* name, const size_t length) { return nameof(name, length); } +#define NAMEOF(name) template_nameof(NAMEOF_RAW(name), sizeof(NAMEOF_RAW(name)) / sizeof(char) - 1) -// Used to obtain the string name of a variable. -#define NAMEOF_VARIABLE(variable) template_nameof_variable(variable, #variable, sizeof(#variable) / sizeof(char) - 1) -template -inline constexpr const char* template_nameof_variable(const T& variable, const char* name, const size_t length) { return template_nameof(name, length); } -template -inline constexpr const char* template_nameof_variable(const T* const variable, const char* name, const size_t length) { return template_nameof(name, length); } -template -inline constexpr const char* template_nameof_variable(T&& variable, const char* name, const size_t length) { return template_nameof(name, length); } +#define NAMEOF_VARIABLE(variable) NAMEOF(variable) #define NAMEOF_VAR(var) NAMEOF_VARIABLE(var) -// Used to obtain the string name of a type. -#define NAMEOF_TYPE(type) template_nameof_type(#type, sizeof(#type) / sizeof(char) - 1) -template -inline constexpr const char* template_nameof_type(const char* name, const size_t length) { return template_nameof(name, length); } - -// Used to obtain the string name of a function. -#define NAMEOF_FUNCTION(function) template_nameof_function(#function, sizeof(#function) / sizeof(char) - 1) -template -inline constexpr const char* template_nameof_function(const char* name, const size_t length) { return template_nameof(name, length); } +#define NAMEOF_FUNCTION(function) NAMEOF(function) #define NAMEOF_FUN(fun) NAMEOF_FUNCTION(fun) + +// Used to obtain the string name of a type. +#define NAMEOF_TYPE(type) template_nameof(NAMEOF_RAW(type), sizeof(NAMEOF_RAW(type)) / sizeof(char) - 1)