模板化 class 中 `is_base_of` 的静态断言因 MSVC 中的意外类型而失败

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

我想确保我的 class 的模板参数之一派生自特定(抽象)class。带着这个意图写了这个

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");