Как вы уже заметили, в использовании sort_ints нет ничего, что указывало бы на его требования к функтору сравнения:
compare_class functor;
sort_ints(items, sizeof(items)/sizeof(items[0]), functor);
В самом sort_ints тоже ничего нет:
template <class ComparisonFunctor>
void sort_ints(int* begin_items, int num_items, ComparisonFunctor c);
И в class_compare мы можем вывести только функциональные возможности, которые будут использоваться, наблюдая, что он не предлагает никаких других функциональных возможностей:
class compare_class
{
public:
bool operator()(int A, int B) const { return A < B; }
};
Компилятор действительно оставляет его, пока не попытается скомпилировать реализацию sort_ints, используятипы, с которыми он создается, прежде чем выяснить, все ли это вместе.У sort_ints должно быть именно то утверждение, которое вы упомянули:
c(*begin_items, *(begin_items+1)); // note: functor argument is "c"
Итак, ваше понимание верно по всем пунктам.НО, стоит отметить, что предложенная функция C ++ 0x под названием Concepts была предназначена для того, чтобы сделать требования sort_int более явными, не рассматривая его реализацию.К сожалению, C ++ 0x пришлось отказаться от этой функции, так как времени и опыта было недостаточно для обеспечения ее оптимальности.Надеемся, что в будущей версии C ++ будет реализована такая возможность.Вы можете найти множество обсуждений Концепций в сети, и они должны помочь вам лучше понять общую проблему.
Это важная проблема, потому что, когда у вас есть только кусочки головоломки - например, функция sort_intsВы хотите использовать, но не пример ComparisonFunctor, тогда вам нужно изучить реализацию sort_ints, чтобы узнать, как создать этот Functor (если только вам не повезло и нет хорошей текущей документации).Вы можете случайно сделать свой код слишком зависимым от существующей реализации, чтобы ваш код ломался или замедлялся недопустимо, когда реализация sort_int изменяется немного позже - даже если этого достаточно, чтобы не нарушать тестовые примеры или код других пользователей илиожидания.Также вероятно, что небольшая ошибка в предоставленном ComparisonFunctor приведет к очень запутанному и сбивающему с толку сообщению об ошибке компилятора где-то в кишках sort_int - это не очень хороший способ предоставить пользователю абстрактную службу.Будем надеяться, что Concepts сделает это за один день ...!