C ++ 14: Форматирование списка параметров с известными типами в строку с использованием функций в DSL - PullRequest
0 голосов
/ 18 мая 2018

Я не совсем уверен, на что обращать внимание при обсуждении этого вопроса, так что извините, если это звучит наивно.

Язык C ++ 14 с Boost.У меня есть известный список структур, подобных этому:

struct Character { std::string name; };
struct Item { std::string name; };
struct Map { std::string name; };

У меня также есть ряд функций, принимающих эти структуры в качестве аргументов и возвращающих std::string:

std::string name(const Character& character) { return character.name; }
std::string itemName(const Item& item) { return item.name; }
std::string mapName(const Map& map) { return map.name; }

То, что я хочубыть в состоянии сделать это:

Character character = {};
Map map = {};
character.name = "David"s;
map.name = "Town"s;
std::string formatted = 
    i18n::localize("Hello, { name($1) }! You are in { mapName($2) }."s, character, map);
assert(formatted.compare("Hello, David! You are in Town."s) == 0);

Функция localize берет список переменных этих известных структур и форматирует их в соответствии с DSL.Намерение состоит в том, чтобы иметь возможность вызывать такие вещи, как possessive($1), чтобы получить притяжательную фразу для персонажа, которая может отличаться, если персонаж является текущим игроком, и разрешить использовать один и тот же DSL для нескольких языков, сохраняя при этом один и тот же номер.аргументов каждый раз.

Поскольку функция possessive может не иметь смысла в контексте другого языка, например китайского, мы могли бы вместо этого вызывать функции для определенных языков в строке DSL для этого языка.Но поскольку в localize передаются только объекты, подлежащие форматированию, мы не будем заранее знать, какую из этих функций вызывать для каждого языка, не углубляясь в длинные условные ветви для каждого отдельного форматирования.

Это пользовательошибка, если синтаксис DSL искажен или функция DSL не может быть применена к данному типу, и функция localize может выдать или что-то в этом случае.Среда DSL может иметь жестко закодированный список функций, с которыми можно что-то отформатировать, или, возможно, это можно сделать (хотя я не знаю, возможно ли это):

i18n::register_formatter( name );
i18n::register_formatter( itemName );

Или вместо этого, если типыпроблема:

i18n::register_character_formatter( name );
i18n::register_item_formatter( itemName );

Я знаю, что в Rust вы можете использовать перечисления для этого:

return match value {
    Value::Character(ref chara) => dispatch_chara(chara),
    Value::Item(ref item) => dispatch_item(item),
    Value::Map(ref map) => dispatch_map(map),
}

Какие виды шаблонов должны произойти для чего-то подобного в C ++ 14?Возможно ли это даже в C ++ 14?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...