好问题,我想分享我的看法... 我想你可以将静态变量的指针作为非类型模板参数传递。从C++20开始似乎不再是问题... 但在那之前,有一些简单的宏可以解决这个问题。
template <const char *Name, typename T>
struct TaggedValue {
static constexpr char const *name{Name};
T value;
friend ostream &operator<<(ostream &o, const TaggedValue &a) {
return o << a.name << " = " << a.value;
}
};
#define ST(name, type)\
const char ST_name_##name[]{#name};\
using name = TaggedValue<ST_name_##name,type>;
ST(Foo, int);
ST(Bar, int);
ST(Bax, string);
int main() {
cout << Foo{3} << endl;
cout << Bar{5} << endl;
cout << Bax{"somthing"} << endl;
}
C++20注释(编辑)
我最近没有经常使用C ++,所以如果有错误请见谅。在c ++ 20中,有一条关于为什么这不是问题的注释。根据template_parameters上的参考:
非类型模板参数必须具有结构类型,其中一种类型是以下类型之一(可以带CV限定词,忽略限定词):
...
- 浮点类型;
- 文字类类型,具有以下属性:
- 所有基类和非静态数据成员均为公共且不可变的,并且
- 所有基类和非静态数据成员的类型都是结构类型或其(可能是多维的)数组。
这使我相信以下代码将起作用:
struct conststr
{
const char * const p;
template<std::size_t N>
constexpr conststr(const char(&a)[N]) : p(a)/*, sz(N - 1) */{}
};
template<conststr s>
struct A{};
int main(int argc, char **argv) {
A<conststr("foo")> x;
}
(我不确定这是否完全正确)。但在我的机器上,使用
g++ -std=c++2a
(
g++ --version == g++ (Debian 8.3.0-6) 8.3.0
),它并没有起作用。它也不能适用于
double
。这位
网友提供了更详细的历史记录,可能有更好的参考资料,而且我可能完全不正确。
const char file::arg[] = __FILE__;
这将允许您回退到 C++03 :)。 - kennytmextern const char arg[] = __FILE__;
来为数组提供外部链接(const对象默认具有内部链接)。 - Johannes Schaub - litb