为什么is_base_of在只是普通的char类型时失败

时间:2014-06-02 03:04:21

标签: c++

你明白为什么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”,仍然失败。

2 个答案:

答案 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_fundamentalis_convertible以获得更复杂的断言。

答案 1 :(得分:4)

std::is_base_of州的documentation

  

如果Derived派生自Base或两者都是相同的非联合   class,提供成员常量值等于true。除此以外   价值是假的。

但是char不是一个类:它是一个原始类型,所以这是预期的结果。