Estou tentando passar uma string de formato que será usada em uma chamada para std::format
e não consigo encontrar uma maneira. Isso é possível ou preciso criar um método para cada formato esperado?
Estou usando o clang 19.1.4 no FreeBSD 14.2 e configurando-std=c++20
Um exemplo simplificado:
#include <format>
#include <iostream>
using namespace std;
class mytest
{
int m_one = 1;
int m_two = 2;
public:
string toString(const string& fmt) const
{
// this works
// return format("{}-{}", m_one, m_two);
// this fails
return format(fmt, m_one, m_two);
}
};
const string MY_FMT = "get {} and add {}";
int main(int argc, char **argv)
{
mytest mt;
string res = mt.toString(MY_FMT);
cout << res << endl;
return 0;
}
Recebo o seguinte erro
sample.cpp:17:23: error: call to consteval function 'std::basic_format_string<char, const int &, const int &>::basic_format_string<std::string>' is not a constant expression
17 | return format(fmt, m_one, m_two);
| ^
sample.cpp:17:23: note: function parameter 'fmt' with unknown value cannot be used in a constant expression
Até C++26 você tem que fazer isso:
Veja esta resposta para mais detalhes. A string de formato em
std::format
deve ser de tempo de compilação. Com C++26, você pode usarstd::format_runtime(fmt)
.Mas a abstração que você quer é um pouco estranha de qualquer maneira. O usuário precisa saber quais são os tipos para construir uma string de formato, o que não é bom. Abordagem sugerida: defina um formatador que
std::format("{}", mt)
faça a coisa certa. Então, se você tiver vários estilos de formato, expresse-os na minilinguagem de formato, assim como{:x}