1

所以我尝试:

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>>。怎么做这样的事情?

4

3 回答 3

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
于 2013-01-21T16:51:03.143 回答
1

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

于 2013-01-21T17:40:34.650 回答
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()等于Tstd::vector<int>你只需要专门化data_ppp

template <>
class data_ppp< std::vector<int> > { 
    typedef std::vector<int> T;   
public:       
    virtual boost::shared_ptr< T > getData()
    {
        // add logging, printing or whatever you want
        return boost::shared_ptr<T>(new T());
    }
};
于 2013-01-21T19:55:34.067 回答