c++ - 带 d 指针的模板返回

标签 c++ qt templates

拥有一个转换为特定类的模板方法有时是用户满的,我确实使用了很多,但是在实现“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/

相关文章:

c++ - 如何在 C++ 中从 "public ref class"创建一个公共(public)变量?

c++ - 初始化类中的模板对象 (c++)

c# - T4 在 C# 运行时运行或编译 tt 文件

c++ - 专门化采用通用引用参数的函数模板

c++ - 如何使用 QTcpSocket 监听 qt 中的特定端口?

c++ - 公开 QTimer。 (Qt, C++)

c++ - C++函数定义中的 "Class* &cls"是什么意思?

C++ try-catch 异常处理约定

c++ - 结构和函数 - 不命名类型

sql - QSqlQuery 准备语句 - 正确使用