2017-02-02 2 views
3

Поэтому я попытался использовать метод any_of Boost Hana, но, в отличие от описания в реализации, он по-прежнему вызывает элемент после элемента, который первым удовлетворял предикату. Это ошибка?Boost Hana any_of?

Вот MCVE:

#include <iostream> 
#include <boost/hana.hpp> 

int main() { 
    auto t = boost::hana::tuple_t<int, double, float>; 
    boost::hana::any_of(t, [](auto) { std::cout << "Called\n"; return true; }); 
} 

Выход:

Called 
Called 
+3

Пожалуйста, отправьте сообщение [MCVE] (http://stackoverflow.com/help/mcve). –

+0

Ничто в документации не говорит о том, что оно не будет применяться к нескольким элементам, даже если один из них удовлетворяет предикату. Чтение реализации, поведение соответствует тому, что я ожидаю. Хотя я могу согласиться, что это может быть противоречивым и лично сделало бы это по-другому, заявления с побочными эффектами в предикате также, как правило, не одобряются. – GManNickG

+0

http://www.boost.org/doc/libs/1_63_0/libs/hana/doc/html/structboost_1_1hana_1_1detail_1_1any__of.html – Yamahari

ответ

4

Это ошибка; спасибо, что нашел. Предикат всегда оценивался еще раз, чем строго необходимо. Исправлена ​​ошибка this commit, которая пробивается в Boost 1.64.0.

Это сказанное, документация Hana в специально запрещает вам полагаться на это (а также имеющую побочные эффекты в функциях отправляемых алгоритмов): http://boostorg.github.io/hana/#tutorial-algorithms-effects. Поэтому, хотя я считаю это ошибкой с точки зрения производительности, это не ошибка, потому что она не нарушает контракт, предоставленный вам библиотекой.

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

Смежные вопросы