使用msvc 14,我想将const char *参数检查为非类型模板参数。
template <typename T, const char Key[] = nullptr >
class Base
{
public:
Base() {}
void f_not_null() {
static_assert(Key != nullptr, "may be not null");
}
void f_null() {
static_assert(Key == nullptr, "may be null");
}
};
extern const char A_STRING[] = "a string";
Base<int, A_STRING> test;
test.f_not_null();
Base<int> test1;
test1.f_null();
由于错误C2131,以下代码无法编译:声明时,static_assert(Key != nullptr, "may be not null")
上的表达式未求值为常量
Base<int, A_STRING>
。
如果可能的话,我不想使用包装器:
template <const char *str>
class Str {
};
Base<int, Str<A_STRING> > test;
[...]
有没有办法使之成为可能?
答案 0 :(得分:1)
正如Matthieu所说,只有(并且只有)您进行更改时,这才有效:
extern const char A_STRING[] = "a string";
收件人:
static const char A_STRING[] = "a string";