v0.2.2
This commit is contained in:
parent
bb8cf28a6d
commit
110dd44f58
4 changed files with 47 additions and 36 deletions
58
README.md
58
README.md
|
@ -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
|
||||
-------|-----------|---------
|
||||
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.
|
||||
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
|
||||
* 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
|
||||
|
||||
```cpp
|
||||
NAMEOF(someVar) -> "someVar"
|
||||
NAMEOF(someVar.SomeField) -> "SomeField"
|
||||
|
||||
NAMEOF(someVar.SomeMethod1()) -> "SomeMethod1()"
|
||||
NAMEOF(&SomeStruct::SomeMethod2) -> "SomeMethod2"
|
||||
NAMEOF(somevar) -> "somevar"
|
||||
NAMEOF(somevar.somefield) -> "somefield"
|
||||
NAMEOF(SomeMethod) -> "SomeMethod"
|
||||
```
|
||||
|
||||
* Name of enum
|
||||
|
@ -46,28 +53,20 @@ NAMEOF(SomeEnum::GREEN) -> "GREEN"
|
|||
* Name of type
|
||||
|
||||
```cpp
|
||||
NAMEOF(int[]) -> "int[]"
|
||||
NAMEOF(volatile const int) -> "volatile const int int"
|
||||
NAMEOF(std::string) -> "string"
|
||||
```
|
||||
|
||||
* Constexpr
|
||||
|
||||
```cpp
|
||||
void f() {
|
||||
int i;
|
||||
constexpr auto constexpr_work_fine = NAMEOF(i); -> "i"
|
||||
}
|
||||
constexpr auto constexpr_work_fine = NAMEOF(somevar); -> "somevar"
|
||||
```
|
||||
|
||||
* Compilation check
|
||||
|
||||
```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
|
||||
|
@ -105,21 +104,24 @@ void f() {
|
|||
|
||||
## 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().
|
||||
|
||||
```cpp
|
||||
NAMEOF_FULL(someVar.SomeField) -> "someVar.SomeField"
|
||||
NAMEOF_FULL(&SomeStruct::SomeMethod2) -> "&SomeStruct::SomeMethod2"
|
||||
NAMEOF_FULL(somevar.somefield) -> "somevar.somefield"
|
||||
NAMEOF_FULL(&SomeStruct::SomeMethod) -> "&SomeStruct::SomeMethod"
|
||||
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
|
||||
NAMEOF_TYPE(int[]) -> "int[]"
|
||||
NAMEOF_TYPE(std::string) -> "string"
|
||||
You need to add the single required file [nameof.hpp](include/nameof.hpp), and the necessary switches to enable C++11.
|
||||
|
||||
NAMEOF_TYPE_FULL(std::string) -> "std::string"
|
||||
```
|
||||
## Compiler compatibility
|
||||
|
||||
## License MIT
|
||||
* GCC
|
||||
* Clang
|
||||
* MSVC
|
||||
|
||||
## Licensed under the [MIT License](LICENSE)
|
|
@ -1,4 +1,4 @@
|
|||
// nameof() c++11 example
|
||||
// nameof c++ example
|
||||
//
|
||||
// Licensed under the MIT License <http://opensource.org/licenses/MIT>.
|
||||
// Copyright (c) 2018 Daniil Goncharov <neargye@gmail.com>.
|
||||
|
@ -22,6 +22,7 @@
|
|||
// SOFTWARE.
|
||||
|
||||
#include <nameof.hpp>
|
||||
|
||||
#include <iostream>
|
||||
#include <stdexcept>
|
||||
|
||||
|
@ -65,11 +66,12 @@ void TestCase1() {
|
|||
std::cout << NAMEOF(Color::RED) << std::endl; // RED
|
||||
|
||||
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.somefield) << std::endl; // somefield
|
||||
std::cout << NAMEOF((&somevar)->somefield) << std::endl; // somefield
|
||||
|
||||
std::cout << NAMEOF(othervar.ll.field) << std::endl; // field
|
||||
|
||||
std::cout << NAMEOF(ptrvar) << std::endl; // ptrvar
|
||||
|
@ -90,7 +92,7 @@ void TestCase1() {
|
|||
std::cout << NAMEOF(int[]) << std::endl; // int[]
|
||||
std::cout << NAMEOF(SomeStruct) << std::endl; // SomeStruct
|
||||
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(&SomeStruct::SomeMethod2) << std::endl; // &SomeStruct::SomeMethod2
|
||||
|
|
|
@ -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>.
|
||||
// Copyright (c) 2016, 2018 Daniil Goncharov <neargye@gmail.com>.
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
// nameof() c++11 test
|
||||
// nameof c++ test
|
||||
//
|
||||
// Licensed under the MIT License <http://opensource.org/licenses/MIT>.
|
||||
// Copyright (c) 2018 Daniil Goncharov <neargye@gmail.com>.
|
||||
|
@ -91,9 +91,10 @@ TEST_CASE("NAMEOF") {
|
|||
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.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);
|
||||
|
||||
|
|
Loading…
Reference in a new issue