Я прошу шаблонный трюк, чтобы определить, имеет ли класс конкретную функцию-член с заданной сигнатурой.
Эта проблема похожа на ту, что приведена здесь http://www.gotw.ca/gotw/071.htm, но не та же: в пункте книги Саттера он ответил на вопрос, что класс C ДОЛЖЕН ПРЕДОСТАВЛЯТЬ функцию-член с конкретная подпись, иначе программа не скомпилируется. В моей задаче мне нужно что-то делать, если у класса есть эта функция, иначе делать "что-то еще".
С аналогичной проблемой столкнулся boost :: serialization, но мне не нравится принятое ими решение: шаблонная функция, которая по умолчанию вызывает свободную функцию (которую вы должны определить) с определенной сигнатурой, если вы не определите конкретную функцию-член ( в их случае "serialize", который принимает 2 параметра данного типа) с определенной сигнатурой, иначе произойдет ошибка компиляции. То есть реализовать как навязчивую, так и не навязчивую сериализацию.
Мне не нравится это решение по двум причинам:
- Чтобы не быть навязчивым, вы должны переопределить глобальную функцию "сериализации", которая находится в пространстве имен boost :: serialization, поэтому у вас есть В НАШЕМ КЛИЕНТЕ КОДЕ, чтобы открыть повышение пространства имен и сериализацию пространства имен!
- Стек для устранения этого беспорядка состоял из 10-12 вызовов функций.
Мне нужно определить пользовательское поведение для классов, которые не имеют этой функции-члена, и мои сущности находятся в разных пространствах имен (и я не хочу переопределять глобальную функцию, определенную в одном пространстве имен, пока я нахожусь в другом)
Можете ли вы дать мне подсказку, чтобы решить эту загадку?