170 похожих чатов

Кто-Нибудь может подсказать что тут можно использовать чтобы избавиться от

страшных макросов и перечисления всех возможных 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
}

13 ответов

16 просмотров

X_MACRO может помочь

Интересно, сколько за такое бьют... Перечислять все равно придется, правда (итерирование по перечислению требует ту или иную форму интроспекции, которой в стандарте нет, так или иначе), зато макросов нет, не так ли?) https://pastebin.com/WqyG8L1y Надеюсь, нигде не опростоволосился =)

Aleksei-Budyakov Автор вопроса
Aleksei Budyakov
Спасибо! Чуть позже погляжу, позапускаю

А чем X_MACRO не угодил? Один раз перечислить в нём все возможные варианты, потом использовать. Я правда не увидел в исходном коде, нужен ли препроцессор, поэтому возможно получится обойтись одним тайплистом

Aleksei-Budyakov Автор вопроса
Alexander Karaev
А чем X_MACRO не угодил? Один раз перечислить в нё...

Я его тоже посмотрю. Раньше никогда не использовал. Но выглядит тоже страшно. Спасибо вам тоже *

Aleksei-Budyakov Автор вопроса
Sergey Anisimov
Интересно, сколько за такое бьют... Перечислять вс...

А что это за код стайл? Вы всегда так пишете?

Aleksei Budyakov
А что это за код стайл? Вы всегда так пишете?

С недавних пор - да. Пытался выработать консистентный стиль неоднократно, но с крестами это оказалось очень непросто сделать. В итоге - попробовал "вертикальный" подход вместо "горизонтального" и, в принципе, стало читабельнее, имхо, во многих местах (длинные составные условия, aliasing типов и определение концептов, а также выражения (в частности - с листовыми и агрегатными инициализациями) - яркий пример). Однозначной определенности в форматировании, впрочем, еще нет - слишком мало "обкатывал" еще.

Aleksei-Budyakov Автор вопроса
Sergey Anisimov
С недавних пор - да. Пытался выработать консистент...

А не подскажете (... || topResultsInner<precisions>(n, input, output)) || (throw "Invalid Precision!", true);Параметр анфолдинг тут понятен, а вот вторая часть с throw не совсем.

Aleksei Budyakov
А не подскажете (... || topResultsInner<precision...

Вычисление не дойдет до throw, если хоть один из операндов 'или' будет 'true'

Aleksei Budyakov
А не подскажете (... || topResultsInner<precision...

Это такое костыльное представление Вашего default-case'а. Вы можете его как угодно расписать на самом деле, в т.ч. через более конвенционный if-else. Такое оформление - чисто мои "приколы". Но суть одна и та же: как сам fold работает через lazy-вычисление логики, так и этот импровизированный default-case. А , true там нужен только за тем, чтобы такое выражение в принципе можно было в качестве операнда || подставить. Собственно, именно за это обычно и бьют =) Вся идея довольно простая, в итоге. Логика работает через lazy-вычисления, а fold-expression обеспечивает "кодогенерацию". Все остальное - лишь семантические посредники, чтобы заставить это работать. Такой подход к описанию логики вдохновлен POSIX-шеллом)

Aleksei-Budyakov Автор вопроса
Sergey Anisimov
Это такое костыльное представление Вашего default-...

Интересные "приколы". Мне нравится. Я пока не особо руку набил на таких шаблонных приколах, так что спасибо что делитесь опытом. Скомпилировать вот не удалось ( /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_);

Aleksei Budyakov
Интересные "приколы". Мне нравится. Я пока не особ...

test-case я нормально на godbolt'е собирал предварительно. Можете куда-нибудь на pastebin залить Вашу имплементацию? Судя по ошибке, она куда-то за пределы всей этой ситуации поинтит.

Aleksei-Budyakov Автор вопроса
Sergey Anisimov
test-case я нормально на godbolt'е собирал предвар...

https://pastebin.com/jFFRvZeK Вот полный код. Вызов происходит в конструкторе ClassificationResult. а в том коде что я скинул вам, не было еще одной перегрузки которая не constexpr. Возможно дело в этом

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

Обсуждают сегодня

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
Ребят в СИ можно реализовать ООП?
Николай
33
Вот еще странный косяк, подскажите как бороться. Я git clone сделал себе всего embassy и примеры там запускаю. Всё хорошо. Но вот решил в cargo.toml зависимости не как в приме...
Lukutin R2AJP
2
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Карта сайта