Сравнение указателей статического поля во время компиляции

У меня есть класс B, производный от класса A. A объявляет статическое поле f, и B может объявлять подобное поле с тем же именем. Следующее не работает:

struct A { static int f; };
struct B : A { static int f; }; // A::f is different from B::f
struct C : A {}; // A::f is the same as C::f
BOOST_STATIC_ASSERT((&A::f != &B::f));
BOOST_STATIC_ASSERT((&A::f == &C::f));

Хотя теоретически эти утверждения могут быть проверены во время компиляции, они запрещены, поскольку константные выражения не могут принимать адреса.

Есть ли способ заставить этот вид проверки работать во время компиляции?

3

Решение

Попробуйте поместить определения статических переменных в область действия статических утверждений.

Это прекрасно работает с gcc 4.7.2:

struct A { static int f; };
struct B : A { static int f; };
struct C : A {};

int A::f;
int B::f;

static_assert(&A::f != &B::f, "B");
static_assert(&A::f == &C::f, "C");

int main()
{
}

Компилировать с:

$ g++ -std=gnu++11 test.cpp
$ ./a.out
5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]