Wpis z mikrobloga

#programowanie #cpp

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ć.
  • 12
@GentleMoon: Afaik nie. Ale:

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");
@Rev: @kasper93:

// 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;

}
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.
@KrzaQ2: @Rev: To co piszecie ma sens, ale w moim przypadku "Mikro" jest nazwą zmiennej. Stąd użycie

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.