This commit is contained in:
Neargye 2018-04-11 00:32:51 +05:00 committed by terik23
parent bb8cf28a6d
commit 110dd44f58
4 changed files with 47 additions and 36 deletions

View file

@ -1,11 +1,20 @@
# nameof() c++11 # nameof c++
C++ alternative to [nameof](https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/nameof) operator in [C#](https://en.wikipedia.org/wiki/C_Sharp_(programming_language)). ```text
_ _ __ _____
| \ | | / _| / ____|_ _
| \| | __ _ _ __ ___ ___ ___ | |_ | | _| |_ _| |_
| . ` |/ _` | '_ ` _ \ / _ \/ _ \| _| | | |_ _|_ _|
| |\ | (_| | | | | | | __/ (_) | | | |____|_| |_|
|_| \_|\__,_|_| |_| |_|\___|\___/|_| \_____|
```
Branch | Linux/OSX | Windows Branch | Linux/OSX | Windows
-------|-----------|--------- -------|-----------|---------
master |[![Build Status](https://travis-ci.org/Neargye/nameof.svg?branch=master)](https://travis-ci.org/Neargye/nameof)|[![Build status](https://ci.appveyor.com/api/projects/status/yq5fk0d9mwljbubt/branch/master?svg=true)](https://ci.appveyor.com/project/Neargye/nameof/branch/master) master |[![Build Status](https://travis-ci.org/Neargye/nameof.svg?branch=master)](https://travis-ci.org/Neargye/nameof)|[![Build status](https://ci.appveyor.com/api/projects/status/yq5fk0d9mwljbubt/branch/master?svg=true)](https://ci.appveyor.com/project/Neargye/nameof/branch/master)
C++ alternative to [nameof](https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/nameof) operator in [C#](https://en.wikipedia.org/wiki/C_Sharp_(programming_language)).
Used to obtain the simple name of a variable, type, member or function and etc. 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. 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.
@ -24,16 +33,14 @@ std::cout << NAMEOF(person.address.zip_code) << std::endl; // prints "zip_code"
* Compile-time * Compile-time
* Compilation check * Compilation check
## [Example & Key Use Cases](https://github.com/Neargye/nameof/blob/master/example/example.cpp) ## [Example](example/example.cpp) & Key Use Cases
* Name of a variable, member or function and etc * Name of a variable, member or function and etc
```cpp ```cpp
NAMEOF(someVar) -> "someVar" NAMEOF(somevar) -> "somevar"
NAMEOF(someVar.SomeField) -> "SomeField" NAMEOF(somevar.somefield) -> "somefield"
NAMEOF(SomeMethod) -> "SomeMethod"
NAMEOF(someVar.SomeMethod1()) -> "SomeMethod1()"
NAMEOF(&SomeStruct::SomeMethod2) -> "SomeMethod2"
``` ```
* Name of enum * Name of enum
@ -46,28 +53,20 @@ NAMEOF(SomeEnum::GREEN) -> "GREEN"
* Name of type * Name of type
```cpp ```cpp
NAMEOF(int[]) -> "int[]" NAMEOF(volatile const int) -> "volatile const int int"
NAMEOF(std::string) -> "string" NAMEOF(std::string) -> "string"
``` ```
* Constexpr * Constexpr
```cpp ```cpp
void f() { constexpr auto constexpr_work_fine = NAMEOF(somevar); -> "somevar"
int i;
constexpr auto constexpr_work_fine = NAMEOF(i); -> "i"
}
``` ```
* Compilation check * Compilation check
```cpp ```cpp
void f() {
int i;
NAMEOF(i); -> "i"
NAMEOF(iii); -> error identifier "iii" is undefined
NAMEOF(std::stringgg) -> error namespace "std" has no member "stringgg" NAMEOF(std::stringgg) -> error namespace "std" has no member "stringgg"
}
``` ```
* Validate parameters * Validate parameters
@ -105,21 +104,24 @@ void f() {
## Remarks ## Remarks
* The argument expression identifies a code definition, but it is never evaluated.
* If you need to get the fully-qualified name, you could use the NAMEOF_FULL(). * If you need to get the fully-qualified name, you could use the NAMEOF_FULL().
```cpp ```cpp
NAMEOF_FULL(someVar.SomeField) -> "someVar.SomeField" NAMEOF_FULL(somevar.somefield) -> "somevar.somefield"
NAMEOF_FULL(&SomeStruct::SomeMethod2) -> "&SomeStruct::SomeMethod2" NAMEOF_FULL(&SomeStruct::SomeMethod) -> "&SomeStruct::SomeMethod"
NAMEOF_FULL(std::string) -> "std::string" 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. ## Integration
```cpp You need to add the single required file [nameof.hpp](include/nameof.hpp), and the necessary switches to enable C++11.
NAMEOF_TYPE(int[]) -> "int[]"
NAMEOF_TYPE(std::string) -> "string"
NAMEOF_TYPE_FULL(std::string) -> "std::string" ## Compiler compatibility
```
## License MIT * GCC
* Clang
* MSVC
## Licensed under the [MIT License](LICENSE)

View file

@ -1,4 +1,4 @@
// nameof() c++11 example // nameof c++ example
// //
// Licensed under the MIT License <http://opensource.org/licenses/MIT>. // Licensed under the MIT License <http://opensource.org/licenses/MIT>.
// Copyright (c) 2018 Daniil Goncharov <neargye@gmail.com>. // Copyright (c) 2018 Daniil Goncharov <neargye@gmail.com>.
@ -22,6 +22,7 @@
// SOFTWARE. // SOFTWARE.
#include <nameof.hpp> #include <nameof.hpp>
#include <iostream> #include <iostream>
#include <stdexcept> #include <stdexcept>
@ -65,11 +66,12 @@ void TestCase1() {
std::cout << NAMEOF(Color::RED) << std::endl; // RED std::cout << NAMEOF(Color::RED) << std::endl; // RED
std::cout << NAMEOF(somevar) << std::endl; // somevar 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(::somevar) << std::endl; // somevar
std::cout << NAMEOF(&somevar) << std::endl; // somevar 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(othervar.ll.field) << std::endl; // field std::cout << NAMEOF(othervar.ll.field) << std::endl; // field
std::cout << NAMEOF(ptrvar) << std::endl; // ptrvar std::cout << NAMEOF(ptrvar) << std::endl; // ptrvar
@ -90,7 +92,7 @@ void TestCase1() {
std::cout << NAMEOF(int[]) << std::endl; // int[] std::cout << NAMEOF(int[]) << std::endl; // int[]
std::cout << NAMEOF(SomeStruct) << std::endl; // SomeStruct std::cout << NAMEOF(SomeStruct) << std::endl; // SomeStruct
std::cout << NAMEOF(Long::LL) << std::endl; // LL std::cout << NAMEOF(Long::LL) << std::endl; // LL
std::cout << NAMEOF(volatile const int) << std::endl; // const volatile int std::cout << NAMEOF(volatile const int) << std::endl; // volatile const int
std::cout << NAMEOF_FULL(somevar.somefield) << std::endl; // somevar.somefield std::cout << NAMEOF_FULL(somevar.somefield) << std::endl; // somevar.somefield
std::cout << NAMEOF_FULL(&SomeStruct::SomeMethod2) << std::endl; // &SomeStruct::SomeMethod2 std::cout << NAMEOF_FULL(&SomeStruct::SomeMethod2) << std::endl; // &SomeStruct::SomeMethod2

View file

@ -1,5 +1,11 @@
// nameof() c++11 https://github.com/Neargye/nameof // _ _ __ _____
// Vesion 0.2.1 // | \ | | / _| / ____|_ _
// | \| | __ _ _ __ ___ ___ ___ | |_ | | _| |_ _| |_
// | . ` |/ _` | '_ ` _ \ / _ \/ _ \| _| | | |_ _|_ _|
// | |\ | (_| | | | | | | __/ (_) | | | |____|_| |_|
// |_| \_|\__,_|_| |_| |_|\___|\___/|_| \_____|
// https://github.com/Neargye/nameof
// vesion 0.2.2
// //
// Licensed under the MIT License <http://opensource.org/licenses/MIT>. // Licensed under the MIT License <http://opensource.org/licenses/MIT>.
// Copyright (c) 2016, 2018 Daniil Goncharov <neargye@gmail.com>. // Copyright (c) 2016, 2018 Daniil Goncharov <neargye@gmail.com>.

View file

@ -1,4 +1,4 @@
// nameof() c++11 test // nameof c++ test
// //
// Licensed under the MIT License <http://opensource.org/licenses/MIT>. // Licensed under the MIT License <http://opensource.org/licenses/MIT>.
// Copyright (c) 2018 Daniil Goncharov <neargye@gmail.com>. // Copyright (c) 2018 Daniil Goncharov <neargye@gmail.com>.
@ -91,9 +91,10 @@ TEST_CASE("NAMEOF") {
SECTION("NAMEOF_VARIABLE") { SECTION("NAMEOF_VARIABLE") {
REQUIRE(std::strcmp(NAMEOF(somevar), "somevar") == 0); REQUIRE(std::strcmp(NAMEOF(somevar), "somevar") == 0);
REQUIRE(std::strcmp(NAMEOF(&somevar), "somevar") == 0); REQUIRE(std::strcmp(NAMEOF(&somevar), "somevar") == 0);
REQUIRE(std::strcmp(NAMEOF(::somevar), "somevar") == 0);
REQUIRE(std::strcmp(NAMEOF(somevar.somefield), "somefield") == 0); REQUIRE(std::strcmp(NAMEOF(somevar.somefield), "somefield") == 0);
REQUIRE(std::strcmp(NAMEOF((&somevar)->somefield), "somefield") == 0); REQUIRE(std::strcmp(NAMEOF((&somevar)->somefield), "somefield") == 0);
REQUIRE(std::strcmp(NAMEOF(::somevar), "somevar") == 0);
REQUIRE(std::strcmp(NAMEOF(othervar.ll.field), "field") == 0); REQUIRE(std::strcmp(NAMEOF(othervar.ll.field), "field") == 0);