Я работаю над проектом, который должен ограничиваться стандартом 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++
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Оператор переключения Java: требуется постоянное выражение, но оно постоянное
Anonymous » » в форуме JAVA - 0 Ответы
- 5 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Оператор переключения Java: требуется постоянное выражение, но оно постоянное
Anonymous » » в форуме JAVA - 0 Ответы
- 3 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Это способ передать индекс итерации как постоянное целое число в Python?
Anonymous » » в форуме Python - 0 Ответы
- 6 Просмотры
-
Последнее сообщение Anonymous
-