Для простых вещей я просто использую следующее:
unsigned TokenizeString(const std::string& i_source,
const std::string& i_seperators,
bool i_discard_empty_tokens,
std::vector<std::string>& o_tokens)
{
unsigned prev_pos = 0;
unsigned pos = 0;
unsigned number_of_tokens = 0;
o_tokens.clear();
pos = i_source.find_first_of(i_seperators, pos);
while (pos != std::string::npos)
{
std::string token = i_source.substr(prev_pos, pos - prev_pos);
if (!i_discard_empty_tokens || token != "")
{
o_tokens.push_back(i_source.substr(prev_pos, pos - prev_pos));
number_of_tokens++;
}
pos++;
prev_pos = pos;
pos = i_source.find_first_of(i_seperators, pos);
}
if (prev_pos < i_source.length())
{
o_tokens.push_back(i_source.substr(prev_pos));
number_of_tokens++;
}
return number_of_tokens;
}
Тщательно оговорка: я пишу программное обеспечение обработки данных в реальном времени, где данные поступают через двоичные файлы, сокеты или какой-либо вызов API (I / O, камера). Я никогда не использую эту функцию для чего-то более сложного или критического по времени, чем чтение внешних файлов конфигурации при запуске.
Я не верю, что вы можете достичь этого Таким образом, вам нужно немного изменить свой DSL, чтобы получить эту информацию. Вот как вы можете этого добиться:
class Foo {
static plan = {
vplan_testing {
dir 'global_storage'
}
}
}
def closure = Foo.plan
closure.delegate = this
closure()
def methodMissing(String name, Object args) {
println "$name $args"
if(args[0] instanceof Closure)
args[0].call()
}
Результатом будет
dir [global_storage]
или вы можете определить свой dsl следующим образом:
class Foo {
static plan = {
vplan_testing {
test dir:'global_storage'
}
}
}
замените «test» на что-то значимое для вашего домена. В этом случае вывод будет следующим:
test [[dir:global_storage]]
Надеюсь, это поможет
-ken