Как статически проверить, что два соотношения равны? - PullRequest
5 голосов
/ 08 июня 2011

У меня есть 4 int-константы:

const int a1 = 1024;
const int a2 = 768;
const int b1 = 640;
const int b2 = 480;

, и я хочу статически проверить, что они имеют одинаковое соотношение.Для статической проверки я использую BOOST_STATIC_ASSERT, но он не поддерживает выражения.

Я пробовал это:

BOOST_STATIC_ASSERT( 1e-5 > std::abs( (double)a1 / (double)a2 - (double)b1 / (double)b2 ) );

, но это приводит к следующим ошибкам компиляции:

error: floating-point literal cannot appear in a constant-expression
error: 'std::abs' cannot appear in a constant-expression
error: a cast to a type other than an integral or enumeration type cannot appear in a constant-expression
error: a cast to a type other than an integral or enumeration type cannot appear in a constant-expression
error: a cast to a type other than an integral or enumeration type cannot appear in a constant-expression
error: a cast to a type other than an integral or enumeration type cannot appear in a constant-expression
error: a function call cannot appear in a constant-expression
error: template argument 1 is invalid

Как исправить вышеприведенную строку, чтобы компиляция прошла?

PS У меня нет доступа к функциям c ++ 0x и std :: static_assert, поэтому я использую static для boostутверждать.

Ответы [ 2 ]

9 голосов
/ 08 июня 2011
BOOST_STATIC_ASSERT(a1 * b2 == a2 * b1);
8 голосов
/ 08 июня 2011

Как исправить вышеприведенную строку, чтобы компиляция прошла?

Не прибегая к элегантной переписке уравнения пользователем 763305, вы не сможете. Компилятор прав: «Литерал с плавающей точкой не может появляться в константном выражении». Кроме того, вы также не можете вызывать функции (std::abs) в константных выражениях.

C ++ 0x решит это, используя constexpr.

...