4 Mart 2016 Cuma

static_assert

static_assert
static_assert derleme zamanında hatanın yakalanmasını sağlar. İstenirse hatayı açıklayıcı bir mesaj da verilebilir. C++11 ile gelen bu özellik sayesinde aşağıdaki gibi Boost kullanmaya gerek kalmadı.
BOOST_STATIC_ASSERT((std::is_same<T,U>));
Nerede Tanımlanır
Açıklaması şöyle
A static assert declaration may appear at block scope (as a block declaration) and inside a class body (as a member declaration)
Block scope nedir anlamadım ama şöyle kullanılabilir. Bu kodu bir şekilde block içinde kabul ediyor.
struct foo_t
{
  ...
};
static_assert(...);

Nasıl Çalışır
Çalışması şuna benzer. Eğer expr false ise büyüklüğü -1 olan bir array yaratılmaya çalışılır. Tabiki derleyici bunu derlemez ve hata verir.
// A compile-time assertion.
template <bool>
  struct CompileAssert {
};

#define COMPILE_ASSERT(expr, msg) \
  typedef CompileAssert<(bool(expr))> msg[bool(expr) ? 1 : -1]
Kullanım Örnekleri

static_assert genellikle std::is_same ile beraber kullanılır.
std::is_same<T,T>::value false ise mesajı derleme hatası olarak verir.

Container'ın içerdiği eleman ile ikinci parametre T ile aynı olması
Örnek.
template<typename Container, typename T> 
bool    contains (const Container & theContainer, const T & theReference) {
     static_assert(  std::is_same<typename Container::value_type, T>::value,
                    "Invalid container or type" );
     // ...
}

Metodun signature kontrolu
Şöyle bir template metodumuz olsun
template<typename TCallable>
void Fun(TCallable c){
...
}
TCallable nesnesinin int(double, double) imzasına sahip olduğu şöyle kontrol edilir.
static_assert(std::is_same<decltype(c(0.0,0.0)), int>::value, "c must take two doubles and return int")

Aritmetik Karşılaştırma
#include <cstring>

inline float
int_bits_to_float(const int bits)
{
  static_assert(sizeof(int) >= sizeof(float), "too few bits");
  float target;
  std::memcpy(&target, &bits, sizeof(float));
  return target;
}






Hiç yorum yok:

Yorum Gönder