#include <iostream>
#include <string>
#include <string_view>
constexpr bool validate(std::string_view view, int n)
{
int i = 0;
for (auto& c : view)
{
if (c == '%')
{
i++;
}
}
return i == n;
}
template<class StrLiteral, class ...Vars>
void fmt(StrLiteral str, const Vars&... args)
{
constexpr std::string_view view = str();
static_assert(validate(view, sizeof...(args)), "Wrong format");
printf(view.data(), args...);
}
template<class ...Vars>
void fmt(std::string str, const Vars& ... args)
{
printf(str.c_str(), args...);
}
#define _F(str) []() { return str; }
void main()
{
fmt(_F("compile %d\n"), 555);
fmt(std::string("runtime no check %d\n"), 555);
fmt(_F("compile no args\n"));
//fmt(_F("compile error\n"), 555);
return;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8c3RyaW5nX3ZpZXc+Cgpjb25zdGV4cHIgYm9vbCB2YWxpZGF0ZShzdGQ6OnN0cmluZ192aWV3IHZpZXcsIGludCBuKQp7CglpbnQgaSA9IDA7Cglmb3IgKGF1dG8mIGMgOiB2aWV3KQoJewoJCWlmIChjID09ICclJykKCQl7CgkJCWkrKzsKCQl9Cgl9CglyZXR1cm4gaSA9PSBuOwp9Cgp0ZW1wbGF0ZTxjbGFzcyBTdHJMaXRlcmFsLCBjbGFzcyAuLi5WYXJzPgp2b2lkIGZtdChTdHJMaXRlcmFsIHN0ciwgY29uc3QgVmFycyYuLi4gYXJncykKewoJY29uc3RleHByIHN0ZDo6c3RyaW5nX3ZpZXcgdmlldyA9IHN0cigpOwoKCXN0YXRpY19hc3NlcnQodmFsaWRhdGUodmlldywgc2l6ZW9mLi4uKGFyZ3MpKSwgIldyb25nIGZvcm1hdCIpOwoKCXByaW50Zih2aWV3LmRhdGEoKSwgYXJncy4uLik7Cn0KCnRlbXBsYXRlPGNsYXNzIC4uLlZhcnM+CnZvaWQgZm10KHN0ZDo6c3RyaW5nIHN0ciwgY29uc3QgVmFycyYgLi4uIGFyZ3MpCnsKCXByaW50ZihzdHIuY19zdHIoKSwgYXJncy4uLik7Cn0KCiNkZWZpbmUgX0Yoc3RyKSBbXSgpIHsgcmV0dXJuIHN0cjsgfQoKdm9pZCBtYWluKCkKewoJZm10KF9GKCJjb21waWxlICVkXG4iKSwgNTU1KTsKCWZtdChzdGQ6OnN0cmluZygicnVudGltZSBubyBjaGVjayAlZFxuIiksIDU1NSk7CglmbXQoX0YoImNvbXBpbGUgbm8gYXJnc1xuIikpOwoJLy9mbXQoX0YoImNvbXBpbGUgZXJyb3JcbiIpLCA1NTUpOwoJcmV0dXJuOwp9