Я работаю над проектом, который должен ограничиваться стандартом C ++ 11. Есть один конкретный класс, который я создаю (некоторые детали ниже), чей самый важный метод, я думаю, часто оценивается во время компиляции. Я хотел бы убедиться, что это происходит как можно больше. Если бы я использовал C ++ 20, я бы объявил метод Consteval , но наиболее близкая вещь к C ++ 11, о которой я знаю, это спецификатор ContexPR . Они похожи, но не одинаковы; Функции, отмеченные постоянным , необходимы для оценки во время компиляции, тогда как функции contexpr имеют право на оценку времени компиляции, если обстоятельства являются правильными, но в противном случае оцениваются во время выполнения. Есть ли какой-либо способ в C ++ 11-Soome Cool Hack или оптимизация компилятора-гарантировать или, по крайней мере, дайте очень вероятным, что функция оценивается во время компиляции? (Я знаю, что есть сторонние библиотеки, которые обеспечивают функциональность журнала, но я застрял, пишу свой собственный.) Это должно записать комментарии в файл журнала, но я бы хотел, чтобы он также управлял исключениями для классов, которые содержат член Logger . Я также хотел бы, чтобы вызовы Logger :: log () для записи вывода для журнала файлов только в том случае, если сборка находится в режиме отладки, и в режиме выпуска все вызовы выполнены, за исключением исключительных, которые компилятор превращается в броски исключения. Вот в основном то, что я имел в виду: < /p>
#ifdef NDEBUG // Cmake symbol indicating the build is not a debug build
constexpr bool DEBUGBUILD{false};
#else
constexpr bool DEBUGBUILD{true};
#endif
enum class LogLevel : unsigned {
info, // for ordinary events
error, // for recoverable errors
exception, // for unrecoverable errors
};
class Logger final
{
public:
template
constexpr void log(
LogLevel ll,
outputtableArgs&&... oargs) const
{
if constexpr (DEBUGBUILD)
{
// write oargs out to file_
}
if constexpr (ll == LogLevel::exception)
{
// throw an exception whose message is the stuff in oargs
}
}
private:
mutable std::fstream file_; // fstream to the log file
};
< /code>
Тогда я могу написать код таким образом: < /p>
Logger logger_;
if (something_bad_happens)
{
logger_.log(
LogLevel::exception,
"In an optimized release build this call becomes equivalent to an exception throw"
"But in a debug build it writes to a log file and then throws"
"Which is exactly what I want");
}
else if (something_ordinary_happens)
{
logger_.log(
LogLevel::info,
"In an optimized release build this call is a no-op",
"So it is eligible for elision at compile time in those circumstances",
"But how can I make sure the compiler elides it in that situation?");
}
Подробнее здесь: https://stackoverflow.com/questions/796 ... ior-in-c11
Есть ли способ получить «постоянное» поведение в C ++ 11? ⇐ C++
Программы на C++. Форум разработчиков
-
Anonymous
1748155663
Anonymous
Я работаю над проектом, который должен ограничиваться стандартом C ++ 11. Есть один конкретный класс, который я создаю (некоторые детали ниже), чей самый важный метод, я думаю, часто оценивается во время компиляции. Я хотел бы убедиться, что это происходит как можно больше. Если бы я использовал C ++ 20, я бы объявил метод Consteval , но наиболее близкая вещь к C ++ 11, о которой я знаю, это спецификатор ContexPR . Они похожи, но не одинаковы; Функции, отмеченные постоянным , необходимы для оценки во время компиляции, тогда как функции contexpr имеют право на оценку времени компиляции, если обстоятельства являются правильными, но в противном случае оцениваются во время выполнения. Есть ли какой-либо способ в C ++ 11-Soome Cool Hack или оптимизация компилятора-гарантировать или, по крайней мере, дайте очень вероятным, что функция оценивается во время компиляции? (Я знаю, что есть сторонние библиотеки, которые обеспечивают функциональность журнала, но я застрял, пишу свой собственный.) Это должно записать комментарии в файл журнала, но я бы хотел, чтобы он также управлял исключениями для классов, которые содержат член Logger . Я также хотел бы, чтобы вызовы Logger :: log () для записи вывода для журнала файлов только в том случае, если сборка находится в режиме отладки, и в режиме выпуска все вызовы выполнены, за исключением исключительных, которые компилятор превращается в броски исключения. Вот в основном то, что я имел в виду: < /p>
#ifdef NDEBUG // Cmake symbol indicating the build is not a debug build
constexpr bool DEBUGBUILD{false};
#else
constexpr bool DEBUGBUILD{true};
#endif
enum class LogLevel : unsigned {
info, // for ordinary events
error, // for recoverable errors
exception, // for unrecoverable errors
};
class Logger final
{
public:
template
constexpr void log(
LogLevel ll,
outputtableArgs&&... oargs) const
{
if constexpr (DEBUGBUILD)
{
// write oargs out to file_
}
if constexpr (ll == LogLevel::exception)
{
// throw an exception whose message is the stuff in oargs
}
}
private:
mutable std::fstream file_; // fstream to the log file
};
< /code>
Тогда я могу написать код таким образом: < /p>
Logger logger_;
if (something_bad_happens)
{
logger_.log(
LogLevel::exception,
"In an optimized release build this call becomes equivalent to an exception throw"
"But in a debug build it writes to a log file and then throws"
"Which is exactly what I want");
}
else if (something_ordinary_happens)
{
logger_.log(
LogLevel::info,
"In an optimized release build this call is a no-op",
"So it is eligible for elision at compile time in those circumstances",
"But how can I make sure the compiler elides it in that situation?");
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79637314/is-there-any-way-to-get-consteval-like-behavior-in-c11[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия