Как вы заметили, в использовании 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, чтобы узнать, как создать этот функтор (если только вы не супер повезло, и есть хорошая, текущая документация). Вы можете случайно сделать свой код слишком зависимым от существующей реализации, так что ваш код неприемлемо ломается или замедляется, когда реализация sort_int изменяется чуть позже, даже если это достаточно тонко, чтобы не нарушить тестовые примеры или код других пользователей или ожидания. Также вероятно, что небольшая ошибка в предоставленном ComparisonFunctor вызовет очень запутанное и запутанное сообщение об ошибке компилятора откуда-то из внутренностей sort_int — это нехороший способ предоставить пользователю абстрактный сервис. Будем надеяться, что Concepts сделает это за один день...!
person
Tony Delroy
schedule
31.01.2011