страшных макросов и перечисления всех возможных enum'ов?
То что внутри свича не констэкспрное
void topResults(unsigned int n, InferenceEngine::Blob& input, std::vector<unsigned>& output) {
#define TBLOB_TOP_RESULT(precision) \
case InferenceEngine::Precision::precision: { \
using myBlobType = InferenceEngine::PrecisionTrait<InferenceEngine::Precision::precision>::value_type; \
InferenceEngine::TBlob<myBlobType>& tblob = dynamic_cast<InferenceEngine::TBlob<myBlobType>&>(input); \
topResults(n, tblob, output); \
break; \
}
switch (input.getTensorDesc().getPrecision()) {
TBLOB_TOP_RESULT(FP32);
TBLOB_TOP_RESULT(FP64);
TBLOB_TOP_RESULT(FP16);
TBLOB_TOP_RESULT(Q78);
TBLOB_TOP_RESULT(I16);
TBLOB_TOP_RESULT(U8);
TBLOB_TOP_RESULT(I8);
TBLOB_TOP_RESULT(U16);
TBLOB_TOP_RESULT(I32);
TBLOB_TOP_RESULT(U32);
TBLOB_TOP_RESULT(U64);
TBLOB_TOP_RESULT(I64);
default:
THROW_IE_EXCEPTION << "cannot locate blob for precision: " << input.getTensorDesc().getPrecision();
}
#undef TBLOB_TOP_RESULT
}
X_MACRO может помочь
Интересно, сколько за такое бьют... Перечислять все равно придется, правда (итерирование по перечислению требует ту или иную форму интроспекции, которой в стандарте нет, так или иначе), зато макросов нет, не так ли?) https://pastebin.com/WqyG8L1y Надеюсь, нигде не опростоволосился =)
Спасибо! Чуть позже погляжу, позапускаю
А чем X_MACRO не угодил? Один раз перечислить в нём все возможные варианты, потом использовать. Я правда не увидел в исходном коде, нужен ли препроцессор, поэтому возможно получится обойтись одним тайплистом
Я его тоже посмотрю. Раньше никогда не использовал. Но выглядит тоже страшно. Спасибо вам тоже *
А что это за код стайл? Вы всегда так пишете?
С недавних пор - да. Пытался выработать консистентный стиль неоднократно, но с крестами это оказалось очень непросто сделать. В итоге - попробовал "вертикальный" подход вместо "горизонтального" и, в принципе, стало читабельнее, имхо, во многих местах (длинные составные условия, aliasing типов и определение концептов, а также выражения (в частности - с листовыми и агрегатными инициализациями) - яркий пример). Однозначной определенности в форматировании, впрочем, еще нет - слишком мало "обкатывал" еще.
А не подскажете (... || topResultsInner<precisions>(n, input, output)) || (throw "Invalid Precision!", true);Параметр анфолдинг тут понятен, а вот вторая часть с throw не совсем.
Вычисление не дойдет до throw, если хоть один из операндов 'или' будет 'true'
Это такое костыльное представление Вашего default-case'а. Вы можете его как угодно расписать на самом деле, в т.ч. через более конвенционный if-else. Такое оформление - чисто мои "приколы". Но суть одна и та же: как сам fold работает через lazy-вычисление логики, так и этот импровизированный default-case. А , true там нужен только за тем, чтобы такое выражение в принципе можно было в качестве операнда || подставить. Собственно, именно за это обычно и бьют =) Вся идея довольно простая, в итоге. Логика работает через lazy-вычисления, а fold-expression обеспечивает "кодогенерацию". Все остальное - лишь семантические посредники, чтобы заставить это работать. Такой подход к описанию логики вдохновлен POSIX-шеллом)
Интересные "приколы". Мне нравится. Я пока не особо руку набил на таких шаблонных приколах, так что спасибо что делитесь опытом. Скомпилировать вот не удалось ( /home/openvino/src/code/common/samples/classification_results.h:103:15: note: template argument deduction/substitution failed: /home/openvino/src/code/common/samples/classification_results.h:123:68: error: call to non-'constexpr' function 'InferenceEngine::Precision::Precision(InferenceEngine::Precision::ePrecision)' 123 | topResults<Pr::FP32, Pr::FP16>(n_to_show_, *out_blob_, results_);
test-case я нормально на godbolt'е собирал предварительно. Можете куда-нибудь на pastebin залить Вашу имплементацию? Судя по ошибке, она куда-то за пределы всей этой ситуации поинтит.
https://pastebin.com/jFFRvZeK Вот полный код. Вызов происходит в конструкторе ClassificationResult. а в том коде что я скинул вам, не было еще одной перегрузки которая не constexpr. Возможно дело в этом
Обсуждают сегодня