Шаблон заполнен оператором - PullRequest
4 голосов
/ 22 марта 2011

Можете ли вы использовать шаблоны (или тому подобное) в C ++, чтобы указать, какая операция выполняется в функции?

Я не знаю, как объяснить это более четко, поэтому я покажу вам, как это сделать.может быть (но не) сделано в коде:

template <operator OPERATION> int getMaxOrMin(int a, int b) {
    return a OPERATION b ? a : b;
}

, где будет нахождение максимума или минимума a или b (именно здесь мой псевдосинтаксис немного сбивает с толку, терпите меня):

int max = getMaxOrMin< > > (a, b);
int min = getMaxOrMin< < > (a, b);

Я знаю, что это совсем не так (потому что это даже синтаксически не имеет смысла), но я надеюсь, что это проясняет, что я хочу делать.

Причиной, по которой я задаюсь вопросом, является то, что я делаю реализацию PriorityQueue, и было бы неплохо легко переключаться между поддержкой, являющейся max-heap или min-heap, на лету без копирования и вставки кода, чтобы сделать дваразные классы.

Я знаю, что мог бы сделать это с помощью макроса, но единственный способ, которым я знал бы, как это сделать, - дать мне максимальную кучу или минимальную кучу, но не оба вта же компиляция.Я, наверное, не замечаю пути.

Ответы [ 2 ]

8 голосов
/ 22 марта 2011

Делайте то, что делают std::map и друзья: возьмите функцию сравнения / функтор в качестве параметра шаблона. См std::less и std::greater.

Помните, что стандартная библиотека уже имеет хорошо разработанную и отлаженную очередь приоритетов, которую можно использовать с произвольной функцией сравнения.

2 голосов
/ 22 марта 2011

Да, но вам нужно определить его как функтор:

template <typename OPERATION>
int getMaxOrMin(int a, int b)
{
    OPERATION  operation;
    return operation(a, b) ? a : b;
}

Теперь вы можете использовать его так:

struct myLess
{
    bool operator()(int a,int b) const { return a < b; }
}
struct myGreat
{
    bool operator()(int a,int b) const { return a > b; }
}

void code()
{
    int x = getMaxOrMin<myLess>(5,6);
    int y = getMaxOrMin<myGreat>(5,6);
}

Это похоже на большую работу. Но в стандарте много предопределенных функторов. На этой странице прокрутите вниз до "6: функциональные объекты".
Для вашей ситуации есть:

std::less
std::greater

Таким образом, код становится:

template <typename OPERATION>
int getMaxOrMin(int a, int b)
{
    OPERATION  operation;
    return operation(a, b) ? a : b;
}

void codeTry2()
{
    int x = getMaxOrMin<std::less<int> >(5,6);
    int y = getMaxOrMin<std::greater<int> >(5,6);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...