gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:20:06 25 4
gpt4 key购买 nike

我正在处理模板类 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com