Я использовал эту библиотеку cloning и нашел ее весьма полезной. Поскольку у него было несколько ограничений (мне нужен был более тонкий контроль над процессом клонирования: какое поле, в каком контексте и насколько глубоко нужно клонировать и т. Д.), Я создал расширенную версию. Вы управляете клонированием полей, аннотируя их в классе сущностей.
Чтобы получить его вкус, вот пример класса:
public class CloneMePlease {
@Clone(Skip.class)
String id3 = UUID.randomUUID().toString();
@Clone(Null.class)
String id4 = UUID.randomUUID().toString();
@Clone(value = RandomUUID.class, groups=CustomActivationGroup1.class)
String id5 = UUID.randomUUID().toString();
@Clone.List({
@Clone(groups=CustomActivationGroup2.class, value=Skip.class),
@Clone(groups=CustomActivationGroup3.class, value=Copy.class)})
Object activationGroupOrderTest = new Object();
@Clone(LongIncrement.class)
long version = 1l;
@PostClone
private void postClone(CloneMePlease original, @CloneInject CloneInjectedService service){
//do stuff with the original source object in the context of the cloned object
//you can inject whatewer service you want, from spring/guice to perform custom logic here
}
}
Подробнее здесь: https://github.com/mnorbi/fluidity-cloning
В случае, если это необходимо, существует также расширение спящего режима.
Похоже, вам нужно будет написать свой собственный TokenizerFunction , чтобы сделать то, что вы хотите.
Я знаю, что тема довольно старая, но она показана в верхних ссылках в google при поиске «boost tokenizer по строке»
, поэтому я добавлю свой вариант TokenizerFunction, на всякий случай:
class FindStrTFunc
{
public:
FindStrTFunc() : m_str(g_dataSeparator)
{
}
bool operator()(std::string::const_iterator& next,
const std::string::const_iterator& end, std::string& tok) const
{
if (next == end)
{
return false;
}
const std::string::const_iterator foundToken =
std::search(next, end, m_str.begin(), m_str.end());
tok.assign(next, foundToken);
next = (foundToken == end) ? end : foundToken + m_str.size();
return true;
}
void reset()
{
}
private:
std::string m_str;
};
после того, как мы сможем создать
boost::tokenizer<FindStrTFunc> tok("some input...some other input");
и использовать, как обычный повышающий токенизатор
, используя iter_split, вы можете использовать несколько символьных токенов. В приведенном ниже коде будет приведено следующее: бабуин дельфина mon-key
#include <iostream>
#include <boost/foreach.hpp>
#include <boost/algorithm/string.hpp>
#include <boost/algorithm/string/iter_find.hpp>
// code starts here
std::string s = "dolphin--mon-key--baboon";
std::list<std::string> stringList;
boost::iter_split(stringList, s, boost::first_finder("--"));
BOOST_FOREACH(std::string token, stringList)
{
std::cout << token << '\n'; ;
}
Один из вариантов - попробовать boost :: regex. Не уверен в производительности по сравнению с обычным токенизатором.
std::string s = "dolphin--monkey--baboon";
boost::regex re("[a-z|A-Z]+|--");
boost::sregex_token_iterator iter(s.begin(), s.end() , re, 0);
boost::sregex_token_iterator end_iter;
while(iter != end_iter)
{
std::cout << *iter << '\n';
++iter;
}