I have a storage class, it can add/remove element.
Most of its public functions share a very similar signature as shown function :-
template<class T> class Storage{
    public: void add(T& t){ ... }
    //... other fields,functions
}
A great thing is that T can be value or raw pointer.
Now I want to upgrade this storage to support T=std::unique_ptr too.
This is what I want to accomplish:-
Storage<std::unique_ptr<B>> store;
B* b = new B();
store.add(b);   //my attempt
//^ This call seem to be not appropriate, but this is what I want
Here is my draft :-
template<class T> class Storage{
    public: template<class TWeak> void add(TWeak& tw){
        ...
    }
}
From the draft, I think it is somewhat dangerous to use TWeak as a template argument - TWeak can be anything.
It is contradict to my intention that TWeak can only be T's weakpointer , roughly speaking.
More specifically, I want to enforce this rule :-
When   T=std::unique_ptr<B>   ==>    TWeak have to be B* or std::unique_ptr<B>
When   T=B*                   ==>    TWeak have to be B*
When   T=B                    ==>    TWeak have to be B
How to enforce the rules elegantly?
Aucun commentaire:
Enregistrer un commentaire