这个条件如何放在模板偏特化中?
How can this condition be put in template partial specialization?
template<size_t bits_count, typename = void>
struct best_type {
};
template<size_t bits_count>
struct best_type<bits_count,enable_if_t<bits_count > 8>> { // error: template argument 2 is invalid
typedef byte type;
};
错误是因为解析器将第二个模板参数视为 enable_if_t<bits_count >
,紧跟在随机 8
.
之后
显然,解决这个问题的方法是将 enable_if_t
的参数替换为 bits_count >= 9
,但是否可以采取一些措施来保留原始表达式,以便对未来的读者有意义?
您应该添加额外的括号来向编译器解释您的意思:
template<size_t bits_count>
struct best_type<bits_count,enable_if_t<(bits_count > 8)>> {
typedef byte type;
};
把条件放在括号里。
template<size_t bits_count, typename = std::enable_if_t<true>>
struct best_type {
};
template<size_t bits_count>
struct best_type<bits_count, std::enable_if_t<(bits_count > 8)>> {
using type = byte;
};
另请注意,我已将 void
替换为 std::enable_if_t<true>
,因为它对 reader 更有意义。
另请注意,在 C++
中最好使用 using
别名(与 typedef
s 相比)
template<size_t bits_count, typename = void>
struct best_type {
};
template<size_t bits_count>
struct best_type<bits_count,enable_if_t<bits_count > 8>> { // error: template argument 2 is invalid
typedef byte type;
};
错误是因为解析器将第二个模板参数视为 enable_if_t<bits_count >
,紧跟在随机 8
.
显然,解决这个问题的方法是将 enable_if_t
的参数替换为 bits_count >= 9
,但是否可以采取一些措施来保留原始表达式,以便对未来的读者有意义?
您应该添加额外的括号来向编译器解释您的意思:
template<size_t bits_count>
struct best_type<bits_count,enable_if_t<(bits_count > 8)>> {
typedef byte type;
};
把条件放在括号里。
template<size_t bits_count, typename = std::enable_if_t<true>>
struct best_type {
};
template<size_t bits_count>
struct best_type<bits_count, std::enable_if_t<(bits_count > 8)>> {
using type = byte;
};
另请注意,我已将 void
替换为 std::enable_if_t<true>
,因为它对 reader 更有意义。
另请注意,在 C++
中最好使用using
别名(与 typedef
s 相比)