拥有一个转换为特定类的模板方法有时是用户满的,我确实使用了很多,但是在实现“d 指针”时,它们停止工作,因为我不知道“d' 而在头文件中。有什么方法可以让剪断的波纹管起作用吗?
class BlahPrivate;
class Blah{
public:
template<typename T> T*method(){ return static_cast<T*>( d->object ); }
private:
BlahPrivate *d;
}
最佳答案
首先,如果您想将转换逻辑与模板内部分离,您可以使用 PIMPL(指向实现的指针)惯用语来实现,添加一个间接层。基本上,将此模板放在它自己的 header 中,该 header 确实包含 BlahPrivate 的定义。让它独立。然后制作一个调用上面函数的 .h 文件,除了它将函数调用转发到具有 BlahPrivate 定义和转换逻辑的头文件。
其次,您最好只在 BlahPrivate 中为您想要将其转换为的类型定义隐式转换运算符...例如,将其放入您的类中:
operator std::string() { return std::string("This is a BlahPRivate"); }
将允许您在需要字符串的任何地方使用 BlahPrivate - 这非常漂亮 :) 显然,您希望赋予您的转换更多意义。
不要对隐式转换运算符发疯,否则它会咬你的屁股。实际上,我认为这整件事可能是个坏主意,因为即使是你提出的函数也会使调试变得困难——而不是在你的行上为错误类型得到一个静态转换错误,你会在这个函数中得到它并且还得追根溯源。
类似地,隐式转换可能会在您不希望它们进行转换时进行转换(并起作用):即您在函数中向后写入参数,并且 std::string 被上面的隐式函数自动转换为- 隐式转换会降低类型安全性。 有时手工做事(当它们像 Actor 一样微不足道时)会更好 - 毕竟,你真的不应该经常 Actor - 如果你这样做通常是糟糕设计的标志,你应该重新考虑你的东西正在做。
关于c++ - 带 d 指针的模板返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9277313/