【问题标题】:Supplying constructor for template parameter class without inheritance为没有继承的模板参数类提供构造函数
【发布时间】:2013-01-25 23:43:53
【问题描述】:

我有一个 C++ 类模板。它接受模板参数类 T 并将类型 T 的对象存储为私有成员,可通过称为 data() 的方法访问。下面的代码演示了它。我希望我的类模板提供一个考虑 T 类型的便捷构造函数。例如,一个将 T 的一些字段作为参数并用它们的值初始化封装的 T 对象的构造函数。

做到这一点的一种方法是让用户从模板实例化中派生并在那里添加他们自己的构造函数,但我自然更希望有一种方法来提供 ctor 而无需让用户编写派生类。

template <class T>
class Templ
{
public:
     T& data();
     const T& data() const;
private:
     T obj;
};

现在,如果用户想要一个方便的构造函数,他们必须派生 Templ:

class MyClass : public Templ<MyData>
{
public:
     MyClass (int size, MyClass* parent, float temperature, std::string name);
};

我阅读了一些 C++11 的内容,并有关于让像 STL 这样的构造函数模板具有 std::list::emplace() 方法集的想法,但我不确定常见的最佳实践解决方案是什么。

【问题讨论】:

    标签: c++ templates c++11 constructor


    【解决方案1】:

    是的,C++11 可变参数完美转发就是你想要的:

    template <class T>
    class Templ
    {
    public:
         template<typename... Args>
         explicit Templ(Args&&... args) : obj(std::forward<Args>(args)...) {}
    
         T& data();
         const T& data() const;
    private:
         T obj;
    };
    

    这会将Templ 构造函数的任何参数转发给T 构造函数。

    但我想知道,为什么还要上这门课?你想做什么?

    【讨论】:

    • 它实际上非常有用......我有一个能够存储任何数据的图形节点类,例如包依赖关系图、项目任务树等。我检查了很多设计,包括继承,最好的是有一个 Node 模板。现在我需要一个构造函数,所以我想知道是否可以通过我的 Node 模板为用户提供他们自己的 T 构造函数......你的答案解决了这个问题:)
    • 如果没有 C++11 我该怎么办?我的意思是,对于出于技术原因仍然拒绝使用 c++11 的人来说,常见的解决方案是什么?
    • @fr33domlover C++03 的解决方案是做你正在做的事情——继承并定义一个构造函数。
    • 另外一个问题:如果只有一个参数,而构造函数用于隐式转换怎么办?我可以/应该在构造函数模板中使用“显式”吗?
    • @fr33domlover 是的,虽然它不会有任何效果。
    猜你喜欢
    • 2019-12-14
    • 2019-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-04
    • 1970-01-01
    • 2021-07-13
    • 2013-03-25
    相关资源
    最近更新 更多