Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++의 static_assert

<시간/>

static_assert는 프로그래머가 프로그램을 컴파일한 후 출력을 너무 엉망으로 만들지 않고 화면에 오류를 출력하는 데 유용한 기능입니다.

C++11 및 C++14 초기에는 static_assert에 다른 기능이 있었습니다. 즉, static_assert를 정의하는 동안 자체 메시지를 작성해야 했습니다. 그러나 C++ 17에서는 메시지를 전달하지 않고 static_assert를 호출할 수 있습니다.

BOOST_STATIC_ASSERT와 같은 다른 assert 라이브러리 기능과도 호환됩니다.

구문

{
   auto __range= For-range-Intializer;
   auto __begin= begin-expression;
   auto __end= end-expression;
   for(; __begin!= __end; ++__begin){
      range-declaration= *__begin;
      statement
   }
}

__begin 및 __end의 유형은 다릅니다. 비교 연산자만 필요합니다. 이 변경 사항은 기존 for 루프에 영향을 미치지 않지만 라이브러리에 더 많은 옵션을 제공합니다. 예를 들어, 이 작은 변경으로 범위 TS(및 C++20의 범위)가 범위 기반 for 루프와 함께 작동할 수 있습니다.

C++11 범위 기반 for 루프 -

for (for-range-declaration : for-range-initializer){
   statement;
}

C++14 표준에서 이러한 루프 표현식은 다음 코드와 동일합니다. -

{
   auto __range = for-initializer;
   for ( auto __begin= begin-expresson, __end = end-expression; __begin != __end; ++__begin ){
      for-range-declaration = *__begin;
         statement
   }
}

예시

#include <bits/stdc++.h>
using namespace std;
template <typename T, size_t n, typename F> //Template Declaration
void fillarray (array<T, N> & a, F && f) //Function to store the values{
   static_assert(is_convertible<typename result_of<F()>::type, T>::value,"Incompatible type returned by fun()"); //static_assert signature to ommit the errors.
   for (auto x : a)
      x = f();
}
int main (){
   array<vector<string>, 20> a;
   fillarray(a, []() { return vector<string>{"TutorialsPoint"}; });
   return 0;
}

출력

…
…
…
prog.cpp:20:61: required from here
prog.cpp:10:5: error: static assertion failed:
Incompatible type returned by fun()