具有模板作为参数的类的 C++ 成员函数特化

标签 c++ templates member-functions partial-specialization

我正在处理模板类 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 对 Array 的 operator[] 进行专门化处理,但是我对语法很困惑。我不确定这是否可能。

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> >’

编辑。

解决方案基于 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
            }

最佳答案

如果我没记错的话,你必须专攻整个类(class)。 我没有这样做,而是为特定类创建了参数化的专用函数:

例如:

    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 等

关于具有模板作为参数的类的 C++ 成员函数特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3868334/

相关文章:

c++ - Oracle 7 ProC++ 预编译代码

c++ - 我可以使用 std::bind 将指向成员函数的指针转换为指向函数的指针吗?

javascript - 如何像成员函数一样调用静态函数

c++ - 中断在运行进程时被阻塞的线程的最简单方法

OSX10.8 上的 C++ Hello World 问题

c++ - QGraphicsView 并不总是更新

c++ - 我可以在前向声明中默认模板参数吗

c++ - 为什么模板化友元函数在类中定义时似乎没有公开?

c++ - 使用二元谓词函数的模板作为参数(std::greater,std::equal_to)C++

c++ - 成员函数的正确函数签名模板