Не содержащий макросов, совместимый с MSVC формат std::format с проверкой дополнительных аргументовC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Не содержащий макросов, совместимый с MSVC формат std::format с проверкой дополнительных аргументов

Сообщение Anonymous »

Я использую std::format для ведения журналов, и в целом он отлично работает. Однако std::format игнорирует дополнительные аргументы, которые мне не нравятся. Например, std::format("x = {}", x, y) компилируется, поэтому мне нужна более строгая оболочка.
Я придумал следующее:

Код: Выделить всё

#include 
#include 
#include 

// Dummy counts characters, not placeholders.
consteval std::size_t countPlaceholdersDummy(const auto formatString) {
std::size_t count = 0;
while (formatString[count] != '\0') ++count;
return count;
}

template 
class strictFormatString {
public:
const std::format_string formatString;
consteval strictFormatString(const auto formatString)
: formatString(formatString) {
constexpr std::size_t expected = sizeof...(Args);
constexpr std::size_t actual = countPlaceholdersDummy(formatString);

static_assert(
actual == expected,
"Number of arguments must exactly match number of placeholders");
}
};

template 
auto strictFormat(strictFormatString fmt,
Args&&... args) {
return std::format(fmt.formatString, std::forward(args)...);
}

int main() { strictFormat(""); }
Однако это не удалось скомпилировать в MSVC (Godbolt):

(22): ошибка C2131: выражение не получило константу

(19): примечание: сбой был вызван чтением переменной за пределами ее срока службы

(19): примечание: см. использование 'formatString'

Как это исправить - не прибегая к макросам? В идеале, strictFormatString должен оставаться в коде, поскольку я использую его и для других целей (например, для захвата std::source_location вызывающего объекта).

Подробнее здесь: https://stackoverflow.com/questions/798 ... a-argument
Ответить

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

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

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

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

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