В C ++ возможно объявить класс, который имеет private std::string
элемент данных, который инициализируется с помощью stringized / stringified имени символа экземпляра? Я вижу, что это не может работать для временных, но для lvalues это возможно?
Вот что я хотел бы:
#include <iostream>
#include <string>
class symbol {
public:
symbol() { // here goes some magical sauce }
void print() { std::cout << s_ << std::endl; }
private:
std::string s_;
};
int main() {
symbol bar, bah;
bar.print() // should print "bar" to STDOUT
bah.print() // should print "bah" to STDOUT
}
Если бы я изменил конструктор так, чтобы он принимал строку и вводил макрос препроцессора, я почти мог бы получить то, что хотел, но он плохо пахнет.
#define makesymbol(x) foo x(#x)
symbol(const std::string & s) : s_(s) {}
// Now I can do:
makesymbol(test);
test.print(); // <--- This prints "test" followed by a newline to STDOUT
По сути, я бы хотел, чтобы пользователь не объявлял экземпляры таких символов как:
symbol phi("phi");
Потому что это раздражает читать, раздражает, чтобы напечатать, и избыточно. Я понимаю, почему в некоторых случаях вам может потребоваться сохранить строку, отличную от имени переменной, но я специально пытаюсь решить проблему, когда вы знаете, что строка должна совпадать с именем переменной строки.
Задача ещё не решена.
Других решений пока нет …