Есть ли что-то вроде аннотаций Java в С++?
Например, аннотация @Override отмечает функцию, которая переопределяет другую функцию, и если бы это не так, это дало бы ошибку во время компиляции.
Я ищу что-то подобное на С++.
Есть ли что-то вроде аннотаций Java в С++?
Например, аннотация @Override отмечает функцию, которая переопределяет другую функцию, и если бы это не так, это дало бы ошибку во время компиляции.
Я ищу что-то подобное на С++.
С++ 0x будет иметь эту функцию, где вы можете явно указать, предназначена ли функция-член для переопределения функции базового класса, используйте реализацию по умолчанию, сгенерированную компилятором, и многое другое.
С++ 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/
Существует С++ 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 в базовом классе. Проблема, однако, в том, что базовый класс не может иметь собственную реализацию.
В этом нет ничего для этого. Лучшее, на что можно надеяться, это вариант, специфический для компилятора. Я бы начал с проверки документации для "прагмы" для вашего компилятора.