如何为子项中的函数指定模板参数?

时间:2013-01-21 16:33:11

标签: c++ templates inheritance virtual-functions function-templates

所以我试试:

class data_ppp {
public:
    template <class T>
    virtual boost::shared_ptr<T> getData()
    {
        return boost::shared_ptr<T>(new T());
    }
};

class data_child : public data_ppp {
public:
    template<>
    getData<std::vector<int>>();
};

但是无法获得理想的效果 - 我希望在类data_child getData函数中只返回boost::shared_ptr<std::vector<int>>。怎么做这个?

3 个答案:

答案 0 :(得分:1)

我现在看到的问题的唯一解决方案是:

class data_ppp
{
public:
    template<class T>
    std::shared_ptr<T> getData()
    { return std::shared_ptr<T>(new T()); }
};

class data_child : public data_ppp
{
public:
    std::shared_ptr<int> getData() 
    { return data_ppp::getData<int>(); }
};

用法:

data_child dc;
dc.getData();
//dc.getData<float>(); // compilation error

答案 1 :(得分:1)

根据你的描述。您想要具有不同签名的新功能。因此,您将在子类中处理此getdata,就好像它的函数非常不同,因为返回类型不同。

答案 2 :(得分:0)

会员功能模板(例如您的getData())不能是虚拟的。但是,您可以使用具有虚拟成员函数的类模板:

template <class T>
class data_ppp {
public:        
    virtual boost::shared_ptr<T> getData()
    {
        return boost::shared_ptr<T>(new T());
    }
};

这可以进行大量的自定义。

1)您可以定义一个班级data_ppp< std::vector<int> >。如果该类需要表现为通用T,那么就完成了。

2)如果要覆盖特定数据使用的行为,但对于所有类型T,并且您希望动态使用新功能,则可以从data_ppp<T>派生

template <class T>
class data_child: public data_ppp<T> {
public:       
    virtual boost::shared_ptr<T> getData()
    {
        // add logging, printing or whatever you want
        return boost::shared_ptr<T>(new T());
    }
};

3)如果您只想重新定义getData()的{​​{1}}等于T,则只需要专门化std::vector<int>

data_ppp