`std::sprintf` или `std::snprintf` с пакетом параметров без дополнительного вызова и буфера tmpC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 `std::sprintf` или `std::snprintf` с пакетом параметров без дополнительного вызова и буфера tmp

Сообщение Anonymous »

Есть ли способ избавиться от tmp и второго вызова std::snprintf в Print? Могу ли я сделать то же самое с помощью одного вызова std::snprintf?

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

// arm-none-eabi-g++ -std=c++14 -O3 -Wall -fno-rtti -fno-exceptions

#include 
#include 
#include 
#include 

void TransmitViaUartAndDma(const char * buffer, int len) {
// "Embedded World"
(void)buffer;
(void)len;
}

constexpr std::size_t buf_size = 64; // = sizeof(buffer)/sizeof(buffer[0])
std::array buffer{};

template
void Print(Arg&& arg, Args&&... args) {
std::array tmp{};
int len = std::snprintf(tmp.begin(), buffer.size(),
"%s"
"\n",
std::forward(arg));
// std::printf("len = %d\n", len);
len = std::snprintf(buffer.begin(), buffer.size(),
tmp.cbegin(),
std::forward(args)...);
// std::printf("len = %d\n", len);
TransmitViaUartAndDma(buffer.cbegin(), len);
}

int main() {
std::uint32_t val1{222};
std::uint32_t val2{111};
Print("%u. %u. Hello, ", val1, val2);
// std::printf(buffer.cbegin());
Print("%u. %u. World!", val2, val1);
// std::printf(buffer.cbegin());
return 0;
}

// 222. 111. Hello,
// 111. 222. World!
Демо
Встроенное
Примечание: я не могу использовать std::cout.

Подробнее здесь: https://stackoverflow.com/questions/791 ... al-call-an
Ответить

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

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

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

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

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