до сих пор не получил никакой документации, которая связана с

я есть функцияUser::func()(обратный вызов), который будет вызван классом шаблона (Library<T>).

На первой итерации разработки все знают, чтоfunc() служит только для этой единственной цели.
Через несколько месяцев большинство участников забывают, чтоfunc() для.
После некоторого тяжелого рефакторинга,func() иногда удаляется некоторыми кодировщиками.

Сначала я вообще не думал, что это проблема.
Однако после того, как я снова столкнулся с этимшаблон несколько раз, я думаю, что мне нужна контрмера.

Вопрос

Как оформить это элегантно? (мило && кратко && без дополнительной платы процессора)

пример

Вот упрощенный код:
(Реальная проблема заключается в разброске более 10 библиотечных файлов и более 20 пользовательских файлов и более 40 функций.)

Library.h

template<class T> class Library{
    public: T* node=nullptr;
    public: void utility(){
        node->func();  //#1
    }
};

user.h

class User{
    public: void func(){/** some code*/} //#1
    //... a lot of other functions  ...
    // some of them are also callback of other libraries
};

main.cpp

int main(){
    Library<User> li; .... ;  li.utility();
}
Мои плохие решения1. Комментарий / документ

В качестве первого обходного пути я, как правило, добавляю такой комментарий:

class User{ 
    /** This function is for "Library" callback */
    public: void func(){/** some code*/}
};

Но он быстро испачкается - я должен добавить его к каждому «функционалу» в каждом классе.

2. Переименуйте "func ()"

В реальном случае я склоняюсь к префиксу имени функции так:

class User{ 
    public: void LIBRARY_func(){/** some code*/}
};

Это очень заметно, но имя функции теперь очень длинное.
(особенно когдаLibrary-класс имеет более длинное имя класса)

3. Виртуальный класс с "func () = 0"

Я рассматриваю возможность создания абстрактного класса в качестве интерфейса для обратного вызова.

class LibraryCallback{ 
    public: virtual void func()=0;
};
class User : public LibraryCallback{ 
    public: virtual void func(){/** some code*/}
};

Это дает ощущение, чтоfunc() длячто-то-очень-внешнее. :)
Однако я должен пожертвовать стоимостью виртуальных звонков (v-таблица).
В критических случаях я не могу себе этого позволить.

4. Статическая функция

(идея от Даниэля Жура в комментарии, спасибо!)

Почти 1 месяц спустя, вот как я использую: -

Library.h

template<class T> class Library{
    public: T* node=nullptr;
    public: void utility(){
        T::func(node);  //#1
    }
};

user.h

class User{
    public: static void func(Callback*){/** some code*/} 
};

main.cpp

int main(){
    Library<User> li;
}

Это, вероятно, чище, но все еще не хватает самодокументирования.

Ответы на вопрос(9)

Ваш ответ на вопрос