【问题标题】:How to instantiate a templated class with non-default constructors如何使用非默认构造函数实例化模板类
【发布时间】:2019-04-01 03:42:39
【问题描述】:

请考虑以下示例:

class Generator {
public:
    Generator(int n)
        : m_n(n)
    {
    }

    int f()
    {
        return m_n;
    }
private: 
    int m_n;
};

template<class BaseClass>
class Transformer : public BaseClass
{
public:
    Transformer(int mult, int add)
        : m_mult(mult)
        , m_add(add)
    {

    }

    int f()
    {
        return BaseClass::f() * m_mult + m_add;
    }

private:
    int m_add;
    int m_mult;
};

想象有更多的Generator 类,它们的构造函数中有不同的参数。现在我想实例化一个包含传递所有必需参数的类。 所以我尝试了以下方法,但 Generator 显然不被识别为基类:

class TG : public Transformer<Generator>
{
public:
    TG(int n, int mult, int add)
        : Generator(n)              // error C2614: 'TG': illegal member initialization: 'Generator' is not a base or member
        , Transformer(mult, add)
    {}
};

TG t(n,mult,add);

接下来我尝试了模板专业化:

template<> Transformer<Generator>::Transformer(int n, int mult, int add)    // error C2244: 'Transformer<Generator>::Transformer': unable to match function definition to an existing declaration
    : Transformer(mult,add)
    , Generator(n)
{};

Transformer<Generator> t(n,mult,add);

如何实例化具有非默认构造函数的模板?

【问题讨论】:

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


    【解决方案1】:

    想象有更多的生成器类,它们的构造函数有不同的参数。现在我想实例化一个包含传递所有必需参数的类

    在我看来,如果你至少可以使用 C++11,那么你需要一个可变参数模板构造函数,如下所示

    template <typename ... As>
    Transformer (int mult, int add, As && ... as)
        : BaseClass{std::forward<As>(as)...}, m_mult{mult}, m_add{add}
     { }
    

    这个想法是构造函数首先接收成员的值(m_multm_add),然后是基类的可变参数列表(完美转发;不是必需的,但可以有用,一般来说)。这个顺序是必要的,因为 deduces 参数的可变参数列表必须在最后一个位置。

    TG 构造函数变为

    template <typename ... As>
    TG (int mult, int add, As && ... as)
       : Transformer{mult, add, std::forward<As>(as)...}
     { }
    

    【讨论】:

    • 抱歉,这可能是误导。我已经改写了这个问题。但是,如果你有更多的生成器类在它们的构造函数中有不同的参数,你会怎么做?
    • @MiB_Coder - 我明白了......是的,这是一个完全不同的问题;给我几分钟,我重写我的答案提出解决方案
    • @MiB_Coder - 答案已修改。一个疑问:你只标记了 C++;适合你的 C++11 解决方案吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多