C ++ Format String Compile-Zeit-GültigkeitsprüfungC++

Programme in C++. Entwicklerforum
Anonymous
 C ++ Format String Compile-Zeit-Gültigkeitsprüfung

Post by Anonymous »

Ich versuche, eine C ++ -Funktion für die Lokalisierung zu implementieren.

Code: Select all

// Language package, containing key-value pairs of translation, e.g.,
// g_LanguagePack["HELLO@1"] = "Hello, {}!"
// The "@N" suffix indicates that this format string has N parameters.
// When there is no parameter, the suffix can be omitted.
std::unordered_map g_LanguagePack;

// The translator function
template 
std::sting Translate(const std::string& key, VA&&... params);
Wenn Sie aufgerufen werden, z.

Code: Select all

key
ist garantiert eine Kompilierungs-Zeit-Zeichenfolge (der Typ von Key muss möglicherweise geändert werden), und in der Praxis kann Entwickler möglicherweise eine nicht übereinstimmende Anzahl von Parametern oder fehlende @n bei der Bereitstellung von Parametern anbieten. Ich denke, es ist notwendig, einen Überprüfungsmechanismus hinzuzufügen, um sicherzustellen, dass n == sizeof ... (va) . Dann habe ich eine benutzerdefinierte Literalstring gelernt: Kompilierungszeitlänge Prüfung, dass ich in Constval Funktionen direkt verwenden kann, und es funktioniert. Und wenn es nicht empfohlen wird, was könnte eine bessere Implementierung sein? < /P>

Code: Select all

template 
consteval void Checker(const char (&key)[N], VA&&... va)
{
std::string_view string_view(key, N - 1);
std::size_t param_cnt = 0;
auto indicator_index = string_view.find('@');
if (indicator_index == std::string_view::npos) // no params
{
assert(sizeof...(VA) == 0);
}
else
{
// parse param_cnt_
for (auto i = indicator_index + 1; string_view.begin() + i != string_view.end(); i++)
{
auto digit = string_view.at(i); // get digit
assert('0'

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post