Czy w języku c ++ można pobrać jako łańcuch nazwę zmiennej, która została przekazana jako parametr?

Nov 29 2020

Chciałbym móc coś takiego zrobić

int myVar = 3;

void logger(int param) {
  std::cout << nameOf(param) << ": " << param << std::endl;
}

logger(myVar); // prints "myVar: 3"

Odpowiedzi

4 cigien Nov 29 2020 at 19:14

Nie, nie możesz jeszcze tego zrobić w języku C ++, ponieważ nie ma możliwości odbicia, aby to zrobić.

Możesz jednak użyć makr preprocesora, aby osiągnąć żądany efekt. Należy pamiętać, że makra są niebezpieczne i należy ich unikać w miarę możliwości.

Najpierw napisz funkcję implementacyjną, która przyjmuje wartość parametru i nazwę parametru, na przykład:

void logger_impl(int param, std::string param_name) {
  std::cout << param_name << ": " << param << std::endl;
}

Następnie możesz napisać makro, które generuje ciąg z nazwy zmiennej w witrynie wywołania, używając #(operator stringification), a następnie używa tego ciągu w wywołaniu funkcji implementacji:

#define logger(p) logger_impl(p, #p)

Oto demo .