【问题标题】:operator overloading and template specialization运算符重载和模板特化
【发布时间】:2012-05-23 11:38:36
【问题描述】:

我有一个模板类template<typename T, typename R>。 R 的类型为 vector<T*>list<T*>

我希望我的类重载[] 运算符,这样如果它是一个向量,我将使用内置的[] 运算符来提高效率,如果它是一个列表,我将使用迭代器来实现它。

对我来说,这听起来像是模板专业化的工作,所以我想写这样的东西:

template<typename T, typename R>
T& tContainer_t<T, R>::operator[]( unsigned i )
{
    //TODO with iterators   
}

template<>
T& tContainer_t::operator[]<T, std::vector<T*> >( unsigned i )
{
    // TODO with built in [] operator
}

这是错误的,编译器不允许这样做。

有没有办法让它工作,或者我应该使用typeid() 在运行时区分这两个对象并采取相应的行动?

【问题讨论】:

    标签: c++ templates operator-overloading


    【解决方案1】:

    使用模板的方法是在一个可以部分特化的类中创建一个静态辅助函数。但是,我会做的是:

    template<typename T, typename R>
    T& tContainer_t<T, R>::operator[]( unsigned i )
    {
        //assuming that the container refernce is name container;
        typename R::iterator itr = container.begin();
        std::advance(itr, i);
        return *itr;
    }
    

    std::advance 保证对于具有随机访问迭代器(例如向量)的容器,它是恒定时间(基本上是迭代器 + n),它可以与指针查找向量执行的速度一样快。否则,它会执行iterator++ n 次,这将是线性时间。 const 版本将使用 const_iterator,但本质上是相同的。

    这样做可以让您正确处理不同类型的容器(不仅仅是向量和列表),而无需修改代码。

    【讨论】:

    • 认为我们可以就回答这个问题的方式达成一致。 :-)
    • @BoPersson:我想我们可以:)
    【解决方案2】:

    您不必重载运算符。库 aleady 包含可以帮助您的重载函数。 std::advance 将移动迭代器,利用 operator+() 进行随机访问迭代器。

    template<typename T, typename R>
    T& tContainer_t<T, R>::operator[]( unsigned i )     
    {
        typename R::iterator it = myContainer.begin();
        std::advance(it, i);
    
        return *it;
    } 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多