拥有强制转换为特定类的模板方法有时会很麻烦,我确实使用了很多东西,但是在实现“d指针”时,它们停止了工作,因为我不知道“d”的内部在头文件中。被切断的波纹管有什么工作方式吗?
class BlahPrivate;
class Blah{
public:
template<typename T> T*method(){ return static_cast<T*>( d->object ); }
private:
BlahPrivate *d;
}
最佳答案
首先,如果您想将转换逻辑与模板内部分开,则可以使用PIMPL(指向Impl的指针)惯用语来做到这一点,并添加一个间接层。基本上,将此模板放置在其自己的 header 中,该 header 确实包含BlahPrivate的定义。使它独立。然后制作一个.h文件来调用上面的函数,除了将函数调用转发到具有BlahPrivate定义和强制转换逻辑的头文件中。
其次,最好在BlahPrivate中为要转换为...的类型定义隐式转换运算符,例如,将其放入类中:
operator std::string() { return std::string("This is a BlahPRivate"); }
可以让您在需要字符串的任何地方使用BlahPrivate-这非常漂亮:)显然,您希望为 Actor 表赋予更多含义。
不要对隐式强制转换运算符发疯,否则它会咬你。实际上,我认为整件事可能不是一个好主意,因为即使您提出的函数也将使调试变得困难-而不是在带有错误的行上为错误类型获取静态强制转换错误,您将在此函数中得到它,并且必须追溯。
类似地,当您不希望隐式强制转换时,隐式强制转换可能会执行强制转换(和工作):即您在函数中向后编写了参数,并且上述隐式函数自动将std::string转换为-隐式强制转换降低类型安全性。 有时手工做某事(当它们像 Actor 一样琐碎时)会更好-毕竟,您真的不必经常铸造-如果这样做,通常是不良设计的标志,您应该重新考虑自己的想法在做。