Есть ли способ получить «постоянное» поведение в C ++ 11?C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Есть ли способ получить «постоянное» поведение в C ++ 11?

Сообщение 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?");
}


Подробнее здесь: https://stackoverflow.com/questions/796 ... ior-in-c11
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Оператор переключения Java: требуется постоянное выражение, но оно постоянное
    Anonymous » » в форуме JAVA
    0 Ответы
    5 Просмотры
    Последнее сообщение Anonymous
  • Оператор переключения Java: требуется постоянное выражение, но оно постоянное
    Anonymous » » в форуме JAVA
    0 Ответы
    3 Просмотры
    Последнее сообщение Anonymous
  • Есть ли способ получить «постоянное» поведение в C ++ 11?
    Anonymous » » в форуме C++
    0 Ответы
    3 Просмотры
    Последнее сообщение Anonymous
  • Это способ передать индекс итерации как постоянное целое число в Python?
    Anonymous » » в форуме Python
    0 Ответы
    6 Просмотры
    Последнее сообщение Anonymous
  • Постоянное перенаправление на стороне сервера Nextjs вместо страницы 404
    Гость » » в форуме Javascript
    0 Ответы
    37 Просмотры
    Последнее сообщение Гость

Вернуться в «C++»