模板类中' is_base_of '的静态断言在MSVC中因类型意外而失败

Static assertion of `is_base_of` in templated class fails with unexpected type in MSVC

本文关键字:MSVC 类型 失败 断言 意外 of is base 静态      更新时间:2023-10-16

我想确保我的类的一个模板参数是从一个特定的(抽象)类派生的。为了这个目的,我写了

class abstract_record
    {};
        template<typename Record, typename Container = std::vector>  //requires SequenceContainer<Container> //See ISO/IEC PRF TS 19217
    class mddb_adapter : public Wt::WAbstractTableModel
    {
        static_assert(std::is_base_of<abstract_record, Record>,"Record must be derived of MDDB_Service::MDDB_Web::abstract_record");
...

但是我得到一个编译错误:

error C2226: syntax error : unexpected type 'std::is_base_of<abstract_record,Record>'

这是MSVC的问题(我使用的是Visual Studio 2013 Express)还是我错了,例如我如何解决这个问题?

is_base_of的验证结果可以通过一个静态嵌套的value数据成员访问:

static_assert(std::is_base_of<abstract_record, Record>::value
//                                                    ~~~~~~^
     , "Record must be derived of MDDB_Service::MDDB_Web::abstract_record");

如果编译器支持constexpr对转换操作符求值,则可以使用以下语法:

static_assert(std::is_base_of<abstract_record, Record>{}
//                                                    ↑↑
     , "Record must be derived of MDDB_Service::MDDB_Web::abstract_record");