Утверждение времени компиляции? - PullRequest
33 голосов
/ 20 июля 2011

Есть ли способ, которым я могу утверждать, что два константных выражения равны во время компиляции?

например, я хочу, чтобы это вызывало ошибку во время компиляции

enum { foo=263, bar=264 };
SOME_EXPRESSION(foo,bar)

, но я хочу, чтобы это не вызывало ошибку

enum { foo=263, bar=263 };
SOME_EXPRESSION(foo,bar)

edit: theвыше было упрощено.Моя ситуация больше похожа на

some_other_file_I_dont_control.h:

class X
{
public:
   enum { foo=263 };
}

my_file.h:

enum { bar=something+somethingelse }; // bar should equal X::foo
SOME_EXPRESSION(X::foo, bar)

Ответы [ 12 ]

0 голосов
/ 20 июля 2011
template<int X, int Y>
struct Check
{
  enum { value = false };
};

template<int X>
struct Check<X,X>
{
  enum { value = true };
};

Я взял пример int.Вы можете изменить его в соответствии с вашими потребностями. Вот демоверсия .Использование:

Check<foo, bar>::value
0 голосов
/ 20 июля 2011

Вы можете использовать магию препроцессора, например

#define FOO_VALUE 263
#define BAR_VALUE 264

enum {foo=FOO_VALUE, bar=BAR_VALUE}

#if !(FOO_VALUE == BAR_VALUE)
#error "Not equal"
#endif
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...