变量名称作为字符串数据成员

时间:2013-01-18 04:26:19

标签: c++ metadata c-preprocessor stringification

在C ++中是否可以声明一个具有private std::string数据成员的类,该成员使用实例符号名称的字符串化/字符串化名称进行初始化?我可以看出这对临时工作不起作用,但对于左值是否可能呢?

这就是我想要的:

#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");

因为阅读烦人,打字烦人,多余。我可以看到为什么在某些情况下你可能想要一个比变量名更多的字符串存储,但是我特意试图解决你知道你希望字符串等于字符串化变量名的问题。

0 个答案:

没有答案