Java-подобные аннотации в С++

Есть ли что-то вроде аннотаций Java в С++?

Например, аннотация @Override отмечает функцию, которая переопределяет другую функцию, и если бы это не так, это дало бы ошибку во время компиляции.

Я ищу что-то подобное на С++.

Ответ 1

С++ 0x будет иметь эту функцию, где вы можете явно указать, предназначена ли функция-член для переопределения функции базового класса, используйте реализацию по умолчанию, сгенерированную компилятором, и многое другое.

Ответ 2

С++ 11 обеспечивает поддержку обобщенных атрибутов, которые можно рассматривать как расширенный набор аннотаций Java, так как они могут применяться не только к переменным/функциям, но и, например, к операторам. Но С++ 11 определяет только синтаксис для обобщенных атрибутов, а не средства для их определения пользователем.

Эта статья дает хороший обзор обобщенных атрибутов: http://www.codesynthesis.com/~boris/blog/2012/04/18/cxx11-generalized-attributes/

GCC поддерживает эту функцию с версии 4.8, согласно: http://gcc.gnu.org/projects/cxx0x.html

Чтобы реализовать поддержку пользовательских атрибутов, плагины компилятора являются многообещающими, особенно на основе высокоуровневой языковой интеграции, такой как https://fedorahosted.org/gcc-python-plugin/

Ответ 3

Существует С++ 0x, который имеет переопределение "аннотации". Или, если вы хотели бы получить больше "Java-интерфейса" такого же кода, что и ошибки, если вы не реализуете методы, вы можете использовать абстрактный класс:

    class Base {
public:
    virtual void foo() = 0;
};

class Extended : public Base {
public:

    void foo2() {
        cout << "hi" << endl;
};

int main() {
    Extended e;
    e.foo();
}

Это приведет к ошибке компилятора, если вы не переопределите foo в базовом классе. Проблема, однако, в том, что базовый класс не может иметь собственную реализацию.

Ответ 4

В этом нет ничего для этого. Лучшее, на что можно надеяться, это вариант, специфический для компилятора. Я бы начал с проверки документации для "прагмы" для вашего компилятора.