Специализация функции-члена c ++ для класса, в котором в качестве параметра используется шаблон - PullRequest
3 голосов
/ 06 октября 2010

Я работаю над шаблоном класса Array, который принимает в качестве параметра другой шаблон TRAITS.

template <typename BASE, typename STRUCT>
    class Traits {
    public:
        typedef BASE   BaseType;
        typedef STRUCT Struct;
        // .. More here
     };

template <class TRAITS>
    class Array {
    public:
        typedef TRAITS                          Traits;
        typedef typename Traits::BaseType       BaseType;
        typedef typename Traits::Struct         Struct;

        Struct& operator[](size_t i)
        {
            // access proper member
        }
        // More here...
    };

Я хотел специализировать оператор [] массива на основе Traits :: Struct, однако я застрял с синтаксисом. Я не уверен, возможно ли это вообще.

template <typename B>
    typename Array<Traits<B, RuntimeDefined>>::Struct&
    Array<Traits<B, RuntimeDefined>>::operator[](size_t a_index)
    {
        // Access proper member differently
    }

Компилятор (g ++ 4.4) жалуется:

In file included from array.cpp:8:
array.h:346: error: invalid use of incomplete type ‘class Array<Traits<N, RuntimeDefined> >’
array.h:26: error: declaration of ‘class Array<Traits<N, isig::RuntimeDefined> >’

EDIT.

Решение основано на предложении aaa и выглядит так:

        Struct& operator[](size_t i)
        {
            return OperatorAt(i, m_traits);
        }

        template <typename B, typename S>
            inline Struct& OperatorAt(size_t i, const Traits<B, S>&)
            {
                // return element at i
            }

        template <typename B>
            inline Struct& OperatorAt(size_t i, const Traits<B, RuntimeDefined>&)
            {
                // partial specialisation
                // return element at in a different way
            }

1 Ответ

0 голосов
/ 06 октября 2010

если я правильно знаю, вам пришлось специализировать весь класс. вместо этого я создаю специализированные функции, параметризованные для определенного класса:

Например:

    Struct& operator[](size_t i)
    {
        return operator_(i, boost::type<TRAITS>());
    }
private:
    template<class B>
    Struct& operator_(size_t i, boost::type<B>); // generic
    Struct& operator_(size_t i, boost::type<A>); // specialized

если вам нужно более детальное управление, вы можете использовать бесплатные функции, boost :: enable_if, boost :: mpl и т. Д.

...