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;
}