如何解决在非实例化模板中使用static_assert的正确方法是什么?
例如,我有一些模板类:
template <typename T,typename = void>
struct A {
void Print() {
static_assert(false,"fall into unsupported Print function");
}
};
// an instantiation if T is a unsigned type
template <typename T>
struct A<T,typename std::enable_if_t<std::is_unsigned<T>::value>> {
void Print() {
std::cout << "A<int>" << std::endl;
}
};
但由于标准:
如果无法为模板定义生成有效的专业化名称, 并且该模板未实例化,则模板定义为 格式不正确,无需诊断。
无论模板类是否被实例化,clang都会立即停止编译并显示失败,这不是我的本意。
我尝试了其他方法,例如添加constexpr bool函数以返回false,但都失败了。
那么,只有在模板类被实例化的情况下,我才能触发static_assert
触发器吗?
解决方法
如果static_assert
中的表达式取决于模板参数,则断言将被延迟直到实例化。例如,您可以定义以下类模板deferred_false
:
#include <type_traits> // std::false_type
template<typename>
struct deferred_false: std::false_type {};
然后,在static_assert
中使用它:
template <typename T,typename = void>
struct A {
void Print() {
static_assert(deferred_false<T>::value,"fall into unsupported Print function");
}
};
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。