To teraz coś z rzeczy niepotrzebnych, ale jestem ciekaw. Załóżmy, mam
template
class Wykop {
public:
Wykop(const std::string& name) {
// ...
}
} Sęk w tym, że nazwa jest dokładnie tym samym.
const Wykop foo("Mikro"); Tak jak mówiłem, to bardziej ciekawość, ale czy można to zrobić inaczej, tj. na poziome kompilacji wyciągnąć nazwę? Najfajniej byłoby mieć
const Wykop foo; ale tego się chyba nie da zrobić.
1) Clang/gcc/msvc pozwalają z wyciągnąć nazwę typu (zaraz podrzucę mój kod do tego - tyle, ƶe on nie ma ƶadnej gwarancji co do działania!) (clang i gcc wymagają dodatkowej obróbki wyniku).
2) masz makra. Ohydne, ale standard gwarantuje, ƶe zadziała.
CIPY! #!$%@?! OOP! czemu #!$%@? nikt nie usypia mnie ładnym proceduralnym kodem. Czasami myślę o tym, że najfajniej by było jakby kod wklejała ruda laska. Z cyckami.
To teraz coś z rzeczy niepotrzebnych, ale jestem ciekaw. Załóżmy, mam
template
class Wykop {
public:
Wykop(const std::string& name) {
// ...
}
}
Sęk w tym, że nazwa jest dokładnie tym samym.
const Wykop foo("Mikro");Tak jak mówiłem, to bardziej ciekawość, ale czy można to zrobić inaczej, tj. na poziome kompilacji wyciągnąć nazwę? Najfajniej byłoby mieć
const Wykop foo;ale tego się chyba nie da zrobić.
1) Clang/gcc/msvc pozwalają z wyciągnąć nazwę typu (zaraz podrzucę mój kod do tego - tyle, ƶe on nie ma ƶadnej gwarancji co do działania!) (clang i gcc wymagają dodatkowej obróbki wyniku).
2) masz makra. Ohydne, ale standard gwarantuje, ƶe zadziała.
#
define #!$%@?(type, variable) Wykop variable(#
type);#!$%@?(Mirko, foo);
// identyczne do Wykop foo("Mirko");
typeid(T).name(), ale po pierwsze RTTI jest be, a po drugie faktycznie trzeba tę nazwę jeszcze obrobić (sprawdź co u ciebie zwraca).
// debug.hpp
std::string unmangle(std::string name);
template
```**```
<
```**```
typename
```**```
T>
std::string name_type(){
```**```
auto
```**```
name = unmangle(
```**```
typeid
```**```
(T).name());
``````
```**```
if
```**```
(std::is_const::value) name +=
```_```
" const"
```_```
;
```**```
if
```**```
(std::is_volatile::value) name +=
```_```
" volatile"
```_```
;
``````
```**```
if
```**```
(std::is_reference::value) name +=
```_```
"&"
```_```
;
```**```
else
```**```
```**```
if
```**```
(std::is_pointer::value) name +=
```_```
"*"
```_```
;
``````
```**```
return
```**```
name;
}
decltype... Później,
typeid(T).name()zwraca już tylko nazwę typu oczywiście. Coś mi się wydaje, że nie da się tego przekazać.
Dzięki chłopaki, ze mi po nocy odpowiedzieliście. ;p
Ps. Makra są be.