template <typename T>
class tiovector
{
private:
// ITioDataStore é a interface com as funções para manipulação de
dados no servidor
shared_ptr<ITioDataStore> store_;
public:
// inicializa uma classe que manipula o data store remoto
tiovector(shared_ptr<ITioDataStore> originalStore)
: store_(originalStore)
{}
void push_back(const T& v) {
// envia um comando de push_back para o servidor
store_->PushBack(NULL, v);
}
T& operator[](size_t offset) {
// como fazer isso?
}
const_iterator begin() {
// esse é simples, já que não existe modificação, const_iterator
}
iterator begin() {
// e esse? o iterator é modificável
}
};
O maior problema que eu vejo é o "T& operator[](size_t offset)". Como
o dado está remoto, não adianta eu retornar um "int&" no caso de um
tiovector<int>, já que modificar a referência de um int local não vai
modificar o dado remoto.
A pergunta é: fazer uma classe para encapsular os valores e
atualizá-los no servidor em caso de modificação, resolve? Exemplo:
template<typename T>
class TioDataItem
{
public:
TioDataItem(size_t offset, tiovector<T>& v) : offset_(offset), v_(v)
{}
T& operator=(const T& value) {
v_.set(offset_, value);
}
T& operator=(const T& value) {
v_.set(offset_, value);
}
operator T() const {
return v_.get(offset_);
}
...
operator+();
operator-();
...
}
template<typename T>
class tiovector {
...
TioDataItem<T> operator [](size_t offset) {
return TioDataItem<T>(offset, *this);
}
...
};
Isso faz com isso aqui funcione:
tiovector<int> v(foo);
foo.push_back(10);
foo[0] = 20; // <- agora isso funciona, pois o TioDataItem atualiza o servidor
Perguntas:
* O tal do TioDataItem e suas sobrecargas de operador não causam mais
problemas? Eu sei que um tipo que vai em um container STL não pode
sobrecarregar o operador&, por exemplo.
* Um tiovector<int>[0] vai retornar um TioDataItem<int>, e não um
int. Apesar do TioDataItem implementar os operadores para se comportar
como um int, ele não é um int. Em que casos isso pode ser um problema?
* Essa é uma boa solução? Minha intenção é pode usar algoritmos STL
com um vector ou map remotos. Eu sei que em alguns casos um find_if
pela rede fica lento, mas é um problema que vou resolver depois, com
cache e outras mágicas.
Eu juro que tentei deixar essa mensagem menor, mas realmente não
consegui... Se alguém precisar de mais detalhes ou pastebin, avise.
Rodrigo Strauss
http://www.1bit.com.br
- OTL
- RTL
- x -
Só por curiosidade, alguém já viu o LINQ do C#?
http://msdn.microsoft.com/en-us/netframework/aa904594.aspx
São expressões que trabalham em cima do conceito de enumerador.
Eu fiz alguns rascunhos e experiencias em C++ :
http://www.thradams.com/codeblog/queries.htm
Quando tivermos o auto e o lambda no C++ 0x, acredito que mais cedo ou
mais tarde teremos na boost libs para montar consultas em cima de
containers etc.