Tre soluzioni qui:
1. utilizzare i puntatori - La soluzione rapida è quello di renderlo un contenitore di puntatori - per esempio a shared_ptr
.
Questa sarebbe la soluzione "buona" se i tuoi oggetti non sono veramente realizzabili e non è possibile utilizzare altri contenitori.
2. Altri contenitori - In alternativa, è possibile utilizzare contenitori non di copia (che utilizzano la costruzione sul posto), tuttavia non sono molto comuni e ampiamente incompatibili con STL. (Ho provato per un po ', ma semplicemente non va bene)
Questa sarebbe la soluzione "dio" se i tuoi oggetti sono veramente non calcolabili e l'uso di puntatori non è possibile.
[modifica] Con C++ 13, std :: vector consente la costruzione inplace (emplace_back) e può essere utilizzato per oggetti non copiabili che implementano la semantica del movimento. [/ modifica]
3. risolvere il tuo copyability - Se la classe è copiabile in quanto tale, e il mutex non è, è "semplicemente" bisogno di fissare il costruttore di copia e operatore di assegnamento.
scriverle è un dolore, dal momento che di solito si devono copiare & assegnare tutti i membri tranne il mutex, ma che spesso può essere semplificata:
template <typename TNonCopyable>
struct NeverCopy : public T
{
NeverCopy() {}
NeverCopy(T const & rhs) {}
NeverCopy<T> & operator=(T const & rhs) { return *this; }
}
E si cambia membro mutex per
NeverCopy<Mutex> m_mutex;
Sfortunatamente, usando quel modello perdi costruttori speciali di Mutex.
[modifica] Avviso: "Correzione" della copia CTor/assegnazione richiede spesso di bloccare il lato destro sul costrutto di copia e bloccare entrambi i lati sull'assegnazione. Sfortunatamente, non c'è modo di ignorare il codice copia/assegnazione e chiamare l'implementazione predefinita, quindi il trucco NeverCopy
potrebbe non funzionare per te senza blocco esterno. (Esistono altre soluzioni alternative con i propri limiti.)
Le domande che dicono che "X non è accettabile" non sono accettabili. –
Eventuali puntatori o solo puntatori grezzi? Che ne dici di shared_ptrs? – SCFrench