On Monday, May 13, 2013 10:47:15 PM UTC-3, Rodrigo.Canellas wrote:'h' não vai compilar, mas 'f' e 'g' compilam (e funcionam). Eu queria que 'f' e 'g' nem compilassem.h(a);g(std::move(a));f(a);void g( A && a ) {...}void f( A & a ) {...}A & operator =(const A & ) = delete;A(const A &) = delete;A() {}public:class A {Exemplificando:Olá,O assunto poderia ser: 'como garantir que objetos só existam localmente em uma fç?'Para isso, eu queria impedir que objetos de uma classe fossem passados como parâmetros, seja por valor (esse eu consegui), por & ou por std::move, garantindo (eu acho) q só existam locais em uma fç.
A(A &&) = delete;
A & operator =( A && ) = delete;
};
void h( A a ){...}A a;
.
.
.
Eu tentei achar como sobrescever o 'operador &' como deleted, mas não deu em nada.
'Tô viajando ou existe como fazer isso?Tente ver o que você está querendo fazer fora do contexto de passagem de parâmetros que talvez fique mais explicito e clara a impossibilidade. Um parâmetro referência é uma referência, então, você conseguiria impedir que sejam criadas simples referências para objetos de suas classes? Você consegue impedir que o programador crie um ponteiro que aponte para objetos da sua classe? Isso, é independente do construtores de cópia, que servem na criação de objetos da sua classe, mas não dizem nada a respeito dos derivados (referencias, ponteiros, arrays, ...).--
Antes de enviar um e-mail para o grupo leia:
http://www.ccppbrasil.org/wiki/Lista:AntesdePerguntar
--~--~---------~--~----~---------------------------------~----------~--~----~
[&] C & C++ Brasil - http://www.ccppbrasil.org/
Para sair dessa lista, envie um e-mail para ccppbrasil-...@googlegroups.com
Para mais opções, visite http://groups.google.com/group/ccppbrasil
--~--~---------~--~----~--~-~--~---~----~-----------------~--~----------~
Emprego & carreira: vag...@ccppbrasil.org
http://groups.google.com/group/dev-guys?hl=en
Obrigado pelas respostas!O que gostaria é que um objeto não pudesse ser usado em uma thread diferente da que foi declarado/instanciado. Então na verdade ele pode ser passado como parâmetro para funções dentro da mesma thread.
Como já escrevi como deleted o copy e move constructor, só consegui passar um objeto para uma nova thread via 'std::ref'.
Obrigado pela resposta!
Foi mais ou menos isso que fiz... mas gostaria mesmo de pegar em compilação...
E se vc não tentar impedir? Ao invés disso, criar um std::map<thread_id, Log>? :-)
Acho que o que vc quer implementar exatamente é impossível....
Então, a minha dica é não expor esse objeto totalmente.
Você pode fazer que ele só possa ser acessado por membros de classe estáticos. E esses membros repassam a chamada à um objeto que está dentro do mapa.
Por exemplo:
class Log
{
private:
static std::map<std::thread::id, Log> _logs;
Log();
void _logMessage(std::string);
public:
static void logMessage(std::string str)
{
_logs[std::this_thread::get_id()]._logMessage(str);
}
}
Assim, fica seguro e não precisa checar necessariamente.
--
> Não sei que compiladores já implementam, mas o "thread_local"do C++ 11sim, mas ela ainda pode ser passada para outra thread, por endereço ou
> permite que seja criada/usada uma variável para cada thread
> específica.
>
> thread_local Log threadlog;
referência...etc..
No exemplo simplório que eu mandei sim, thread local é até melhor (se não tem o padrão, todo compilador tem seu próprio)
Mas se o contrutor da classe Log for mais complexo, ou algo do tipo, aí não dá p/ usar...
Mas um objeto 'thread_local' não pode ser passado para outra thread?
A motivação não é o mais importante, agora, mas sim tentar aprender como implementar certos requisitos, por mais "esquisitos" q possam parecer.Mas, para contextualizar, o objetivo é Log. Gostaria q o objeto q loga msgs da thread A não pudesse, em compilação, ser passado para uma thread B, pois registraria msgs de B na mídia destinada às msgs de A (supondo mídias separadas por thread, p/ diminuir concorrência na gravação - ao menos foi isso q eu pensei).