Есть один случай, который не может быть строго идиотом, но достаточно похож, чтобы о нем знать.То есть иметь типобезопасную оболочку шаблона поверх не типизированной версии.
class MapBase
{
public:
void* getForKey(const std::string & k);
void setForKey(const std::string & k, void * v);
...
};
template<typename T>
class MyMap
{
public:
T* getForKey(const std::string &k) { return (T*)base_.getForKey(k); }
void setForKey( const std::string &k, const T* v) { base_.setForKey(k, T*v); }
private:
MapBase base_;
};
Теперь любое использование MyMap<T>
не должно подвергаться воздействию внутренних компонентов MapBase, и вы получаете только одну реализациюкишки этих функций.Я бы также подумал о том, чтобы сделать MapBase абстрактным базовым классом, чтобы сделать разделение еще более сильным.
Как я уже сказал, это не совсем pimpl, но он решает те же проблемы аналогичным образом.