你明白为什么static_assert失败了:
template <typename T>
void
foo(const T &c)
{
static_assert(std::is_base_of<T, char>::value, "T must be char"); // Fails !
}
int main()
{
char c = 'a';
foo<char>(c);
return 0;
}
我换了T和“char”,仍然失败。
答案 0 :(得分:5)
您可能需要考虑添加其他支票:
template <typename T> void foo(const T &c)
{
static_assert(
std::is_base_of<T, char>::value || std::is_same<T, char>::value,
"T must be char");
}
但如果你只关心字符,那么你也可以这样做:
static_assert(std::is_same<T, char>::value, "T must be char");
还要考虑is_fundamental
和is_convertible
以获得更复杂的断言。
答案 1 :(得分:4)
std::is_base_of
州的documentation:
如果Derived派生自Base或两者都是相同的非联合 class,提供成员常量值等于true。除此以外 价值是假的。
但是char
不是一个类:它是一个原始类型,所以这是预期的结果。