Запутался в параметрах для указателя на функцию bool

Я согласен с ответом от zacherates.

Но вы можете сделать вызов intern () в ваших нелиберальных строках.

Из примера zacherates:

// ... but they are not the same object
new String("test") == "test" ==> false 

Если вы ставите нелитеральное равенство строки, это правда

new String("test").intern() == "test" ==> true 
0
задан Saul 10 March 2019 в 18:20
поделиться

2 ответа

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

void heapify(S bt[], unsigned els, bool(*shouldBeBefore)(const S & a, const S & b));

int main() {
    [...]
    heapify(x, 9, shouldBeBefore(test[0], test[1]));
    [...]
}

bool shouldBeBefore(const S & a, const S & b) {
    return a.x < b.x;
}

shouldBeBefore называет функцию, а также аргумент функции. Это добавляет некоторую путаницу. heapify фактически разрешено принимать любую функцию с сигнатурой bool(const S&, const S&), и название должно указывать на это.

Для указателей на функции всегда удобно добавить определение типа

using Comparator = bool(*)(const S&, const S&);
// typedef bool(*Comparator)(const S&, const S&); // or by typedef

Код будет выглядеть как

void heapify(S bt[], unsigned els, Comparator comparator);

int main() {
    [...]
    heapify(x, 9, shouldBeBefore(test[0], test[1]));
    [...]
}

bool shouldBeBefore(const S & a, const S & b) {
    return a.x < b.x;
}

, и вы будете вызывать компаратор, как если бы любая другая функция.

Определение указателя на функцию является многословным. Вы также можете использовать std :: function, что немного упрощает синтаксис

using Comparator = std::function<bool(const S&, const S&>>;

Преимущество состоит в том, что вы можете вызывать heapify с любым вызываемым.

0
ответ дан Mikael H 10 March 2019 в 18:20
поделиться

Переместите ваше объявление (или полное определение) из shouldBeBefore выше main, где вы вызываете heapify. Но когда вы вызываете heapify, вы просто передаете имя функции. heapify вызовет вашу функцию shouldBeBefore со своими собственными параметрами.

void heapify(S bt[], unsigned els, bool(*shouldBeBefore)(const S & a, const S & b));
bool shouldBeBefore(const S & a, const S & b);

int main()
{
    S test[9] = { {1.1,1,'A'},{1.3,2,'B'},{1.8,3,'C'},{1.7,4,'D'},{5.1,5,'E'},
                  {4.3,6,'F'},{3.8,7,'G'},{4.7,8,'H'},{2.7,9,'I'} };

    unsigned int length = sizeof(test)/sizeof(test[0]); // 9

    heapify(S, length, shouldBeBefore);

    return 0;
}

bool shouldBeBefore(const S & a, const S & b) 
{
    return (a.x < b.x);
}

В вашей реализации heapify вы можете вызывать shouldBeBefore, как и любую другую функцию:

void heapify(S bt[], unsigned els, bool(*shouldBeBefore)(const S & a, const S & b))
{
    ...
        if (shouldBeBefore(S[i+1], S[i]) {
            ...
        }
    ...
}
0
ответ дан selbie 10 March 2019 в 18:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: