Второй делитанский вопрос По специализации шаблонов.. в избранное  новое всё   подписка   модер. 
От: alexsy 
Дата: 28.05.08 07:41
Выяснено что можно специализировать не весь клас а тока члены, члены функции и статические члены..

вот мой класс ( написан чисто для тестирования этого вопроса.. ) реализацию приводить не буду .. чисто то что интересует.


/**/
template< typename Type, typename Sequence = std::vector< Type > >
class CSortedArray;
/**/
template< typename Type, typename Sequence >
class CSortedArray{
public:
    typedef typename Sequence::value_type value_type;
    typedef typename Sequence::reference reference;
    typedef typename Sequence::const_reference const_reference;
    typedef typename Sequence::size_type size_type;
    typedef typename Sequence::const_iterator const_iterator;
    typedef Sequence container_type;
    Sequence pvArray;
private:
    typedef typename Sequence::iterator iterator;
    typename CSortedArray< Type, Sequence >::iterator
            find_position( const value_type& f_Element );
    template< typename Iterator >
    void copy_from( Iterator f_Begin, Iterator f_End ){ ... }
public:
    
    explicit CSortedArray( const Sequence& f_Array = Sequence() );
    ~CSortedArray(){};
#if 0 // used by default
    CSortedArray( CSortedArray< Type > const& f_SortedArray );
    CSortedArray< Type >& operator=( CSortedArray< Type > const& f_SortedArray );
#endif
    typename CSortedArray< Type, Sequence >::const_iterator
            insert( const typename CSortedArray< Type, Sequence >::value_type&
                    f_Element );
    size_type size() const;
    bool empty() const;
/*
    const_reference operator[]( size_type ) const{};
*/
    const_iterator begin() const;
    const_iterator end() const;
};
// Далее реализация общей функции
template< typename Type, typename Sequence >
typename CSortedArray< Type, Sequence >::iterator
CSortedArray< Type, Sequence >::find_position( const value_type& f_Element ) {

    typedef typename iterator::difference_type distance;
    iterator begin( pvArray.begin() );
    iterator end( pvArray.end() );
    distance dist( std::distance( begin, end ) );
    while( dist > 0 ){
        dist >>= 1;
        iterator middle( begin );
        std::advance( middle, dist );
        if( middle == pvArray.end() )
            return pvArray.end();
        if( f_Element < *middle )
            end = middle;
        else if( f_Element > *middle )
            begin = middle + 1;
        else
            return middle;
        }
    return end;
}
// Далее реализация специалезированной функции для указателей на cstring
template<>
CSortedArray< char*, std::vector< char* > >::iterator
CSortedArray< char*, std::vector< char* > >::find_position(
        const value_type& f_Element ) \{

    typedef iterator::difference_type distance;

    int test;
    iterator begin( pvArray.begin() );
    iterator end( pvArray.end() );
    distance dist( std::distance( begin, end ) );
    while( dist > 0 ){
        dist >>= 1;
        iterator middle( begin );
        std::advance( middle, dist );
        if( middle == pvArray.end() )
            return pvArray.end();
        test = std::strcmp( f_Element, *middle );
        if( test < 0 )
            end = middle;
        else if( test > 0 )
            begin = middle + 1;
        else
            return middle;
        }
    return end;
}

И так вопрос из объявления шаблона (template< typename Type, typename Sequence = std::vector< Type > > class CSortedArray видно что в качестве последовательности можно указать несколько контейнеров.. по умолчению std::vector, А в специализированной функции указан только std::vector, вот как переписать специалезированную функцию, так чтобы небыло зависимости от контейнера..? или это не возможно ? И надо писать специализацию для std::deque непример