static assert с бонусом
От: Кодт Россия  
Дата: 01.02.08 17:40
Оценка: 44 (6) :)
Захотелось мне узнать sizeof(long double) у Comeau Online.
Естественно, первое поползновение —
#define static_assert(v) static char test_##__LINE__ [v ? 1 : -1]

static_assert( sizeof(long double)==10 ); // и дальше перебирать варианты

Но это как-то не очень продуктивно. Тогда вот:
template<int N> struct IsZero { virtual void foo() = 0; };
template<> struct IsZero<0> {};

#define static_assert_zero(v) static IsZero< v > test_##__LINE__

static_assert_zero( sizeof(long double) );

И за один проход вместо невменяемого "the size of an array must be greater than zero"
я получил "object of abstract class type "IsZero<12>" is not allowed".

Мораль: таким способом можно не только ловить ошибки, но и получать разную полезную информацию про них.
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re: static assert с бонусом
От: Vain Россия google.ru
Дата: 01.02.08 18:38
Оценка: 49 (3)
Здравствуйте, Кодт, Вы писали:

К>
К>template<int N> struct IsZero { virtual void foo() = 0; };
К>template<> struct IsZero<0> {};

К>#define static_assert_zero(v) static IsZero< v > test_##__LINE__

К>static_assert_zero( sizeof(long double) );
К>

К>И за один проход вместо невменяемого "the size of an array must be greater than zero"
К>я получил "object of abstract class type "IsZero<12>" is not allowed".

К>Мораль: таким способом можно не только ловить ошибки, но и получать разную полезную информацию про них.

Это и так можно делать, способов думаю уйма.
template<int N> class IsZero { IsZero(); } ;

IsZero<sizeof(long double)> check;

"1.cpp", line 3: error: "IsZero<N>::IsZero() [with N=8]" (declared at line 1)
          is inaccessible
  IsZero<sizeof(long double)> check;

Я вот, к примеру, использовал его здесь
Автор: Vain
Дата: 02.02.07
.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re: static assert с бонусом
От: remark Россия http://www.1024cores.net/
Дата: 01.02.08 19:31
Оценка: 63 (3)
Здравствуйте, Кодт, Вы писали:

К>И за один проход вместо невменяемого "the size of an array must be greater than zero"

К>я получил "object of abstract class type "IsZero<12>" is not allowed".
К>Мораль: таким способом можно не только ловить ошибки, но и получать разную полезную информацию про них.


+1
Фишка сделать это не ошибкой, а просто выводом компилятора:
template<int i> struct ct_print {};
#define CT_PRINT(...) struct {friend class ct_print<__VA_ARGS__>;}

int main()
{
    CT_PRINT(sizeof(int));
    CT_PRINT(sizeof(long long));
    CT_PRINT(sizeof(long double));
}



Вывод:

Compiling...
warning C4099: 'ct_print<i>' : type name first seen using 'struct' now seen using 'class'
with
[
i=4
]
warning C4099: 'ct_print<i>' : type name first seen using 'struct' now seen using 'class'
with
[
i=8
]
warning C4099: 'ct_print<i>' : type name first seen using 'struct' now seen using 'class'
with
[
i=8
]


Как делать варнинги на разных компиляторах при желании можно подсмотреть а BOOST_STATIC_WARNING.



1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.