具有模板作为参数的类的C++成员函数特化
问题描述:
我正在模板类Array上接受另一个模板TRAITS作为参数。具有模板作为参数的类的C++成员函数特化
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的运算符[],但是我坚持使用语法。我不确定这是否可能。
template <typename B>
typename Array<Traits<B, RuntimeDefined>>::Struct&
Array<Traits<B, RuntimeDefined>>::operator[](size_t a_index)
{
// Access proper member differently
}
编译器(克++ 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
}
答
如果我正确地知道,你不得不专门整个类。的 而不是这样做,我创建专门的功能参数为特定类:
例如:
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
,如果您需要更细粒度的控制,你可以使用免费的功能,增强:: enable_if,升压:: mpl等
非常感谢您提供解决方案的不同观点。 – matejk 2010-10-06 14:39:31