有一个转换为特定类的模板方法有时是用户满足的,而且我确实使用了很多,但是在实现'd-pointer'时,它们停止工作,因为我不知道'内部' d'在头文件中。剪断的波纹管有什么办法可以工作吗?
class BlahPrivate;
class Blah{
public:
template<typename T> T*method(){ return static_cast<T*>( d->object ); }
private:
BlahPrivate *d;
}
答案 0 :(得分:2)
首先,如果要将强制转换逻辑与模板内部结构分离,可以使用PIMPL(指向Impl的指针)成语,添加一个间接层。基本上,将此模板放在其自己的标题中,该标题包括BlahPrivate的定义。让它独立。然后创建一个调用上面函数的.h文件,除了它将函数调用转发到具有BlahPrivate定义和强制转换逻辑的头文件。
其次,你最好只在BlahPrivate中定义隐式转换运算符,以便将它们转换为... ...例如,将它放在你的类中:
operator std::string() { return std::string("This is a BlahPRivate"); }
允许你在任何预期字符串的地方使用BlahPrivate - 它非常漂亮:)显然,你想让你的演员更有意义。
不要对隐式强制转换运算符发疯,否则它会让你陷入困境。实际上,我认为整个事情可能是一个坏主意,因为即使你提出的函数也会使调试变得困难 - 而不是因为错误的线路上的错误类型而得到静态转换错误,你将在这个函数中得到它必须追溯它。
类似地,当你不想要它们时,隐式强制转换可以执行强制转换(和工作):即你在函数中向后编写了参数,并且std :: string one被上面的隐式函数自动转换为 - 隐式演员会降低您的类型安全性。 有时候手工做事(当他们像演员一样琐碎)更好 - 毕竟,你真的不应该经常演员 - 如果你这样做通常是设计糟糕的表现,你应该重新思考你正在做。