C++ 静态\u断言\u失败做什么?
我试图理解SAT解算器(miniSAT)的开源实现。在其中一个头文件中,我遇到了以下代码片段C++ 静态\u断言\u失败做什么?,c++,templates,C++,Templates,我试图理解SAT解算器(miniSAT)的开源实现。在其中一个头文件中,我遇到了以下代码片段 template <bool> struct STATIC_ASSERTION_FAILURE; template <> struct STATIC_ASSERTION_FAILURE<true>{}; #define TEMPLATE_FAIL STATIC_ASSERTION_FAILURE<false>() 模板结构静态断言失败; 模板结构静态断言
template <bool> struct STATIC_ASSERTION_FAILURE;
template <> struct STATIC_ASSERTION_FAILURE<true>{};
#define TEMPLATE_FAIL STATIC_ASSERTION_FAILURE<false>()
模板结构静态断言失败;
模板结构静态断言失败{};
#定义模板\u失败静态\u断言\u失败()
我无法理解这到底是怎么回事。从我对模板的理解来看,它们通常具有
template <class T>
模板
但是在网上查找了一些东西之后,我发现模板可以通过使用
template <datatype>
模板
在这种情况下,数据类型是bool。但我无法完全理解这样一个代码的作用。我对第二行和第三行尤其感到困惑
在代码前面,模板_FAIL用于泛型类的方法,如下所示:-
// Don't allow copying (error prone):
vec<T>& operator = (vec<T>& other) { TEMPLATE_FAIL; }
vec (vec<T>& other) { TEMPLATE_FAIL; }
//不允许复制(容易出错):
向量和运算符=(向量和其他){TEMPLATE_FAIL;}
vec(vec&other){TEMPLATE_FAIL;}
这个特定的代码片段似乎是某些库的一部分,用于检查断言失败。但是,在模板、构造器等方面,我无法完全理解这一点(如果问题格式缺乏一些东西,请给出我如何改进问题格式的建议)
多谢各位 这是一个专门的模板。未定义基本模板
STATIC\u ASSERTION\u FAILURE
,但定义了专门化STATIC\u ASSERTION\u FAILURE
。因此,当且仅当expr
是编译时常量true
时,才定义静态断言失败
实际上,这意味着定义了STATIC\u ASSERTION\u FAILURE
,但没有定义STATIC\u ASSERTION\u FAILURE
。因此,后者是链路错误
C++11为此引入了
static\u assert
。它倾向于给出更清晰的错误信息这是一个专门的模板。未定义基本模板STATIC\u ASSERTION\u FAILURE
,但定义了专门化STATIC\u ASSERTION\u FAILURE
。因此,当且仅当expr
是编译时常量true
时,才定义静态断言失败
实际上,这意味着定义了STATIC\u ASSERTION\u FAILURE
,但没有定义STATIC\u ASSERTION\u FAILURE
。因此,后者是链路错误
C++11为此引入了static\u assert
。它倾向于给出更清晰的错误消息模板结构静态断言失败
声明一个模板类,该类接受一个布尔模板参数
模板结构静态断言失败{}
是传递的模板参数为true时的静态断言失败
的特化
最好用一个例子来理解这是为了什么
假设我们有一个类型特征,它检查类型是否是指针,比如type\u traits
标题中的std::is\u pointer
:
std::is_pointer<int>::value == false
std::is_pointer<int*>::value == true
现在您可以看到,如果我们在一些有效的上下文中使用这些静态断言失败实例化,那么当我们尝试使用映射到静态断言失败的任何东西时,我们将得到一个翻译错误模板结构静态断言失败
声明一个模板类,该类接受一个布尔模板参数
模板结构静态断言失败{}
是传递的模板参数为true时的静态断言失败
的特化
最好用一个例子来理解这是为了什么
假设我们有一个类型特征,它检查类型是否是指针,比如type\u traits
标题中的std::is\u pointer
:
std::is_pointer<int>::value == false
std::is_pointer<int*>::value == true
现在您可以看到,如果我们在一些有效的上下文中使用这些静态\u断言\u失败
实例化,当我们试图使用任何映射到静态断言失败
的东西时,我们会得到一个翻译错误,我很确定这是不对的,因为静态断言失败
与只说向量
是一样的,即它不会编译<代码>静态断言失败()代码>可能会。对于2+2==5
来说,这实际上是一个编译时错误。下面是我如何理解模板作为泛型类使用的。类T就像一个占位符,它代表了任何一个想要使用泛型类的类。现在在这个例子中,不是我们的课。这是我的理解。我们必须定义bool的所有可能值。这里有目的的静态断言失败没有给出定义?我正在看一段旧的源代码,以便更好地理解它。所以它绝对是前C++。11@MichaelAnderson:True,不能仅通过添加分号来使用类型。这不是一个有效的说法。但是,您可以添加()
默认创建它,假设您在允许表达式的范围内。@ameyask86:不定义静态断言\u失败
是故意的。请参阅编辑。我很确定这并不完全正确,因为静态断言\u失败
就是说向量
——也就是说,它不会编译<代码>静态断言失败()代码>可能会。对于2+2==5
来说,这实际上是一个编译时错误。下面是我如何理解模板作为泛型类使用的。类T就像一个占位符,它代表了任何一个想要使用泛型类的类。现在在这个例子中,不是我们的课。这是我的理解。我们必须定义bool的所有可能值。这里有目的的静态断言失败没有给出定义?我正在看一段旧的源代码,以便更好地理解它。所以它绝对是前C++。11@MichaelAnderson