0

我有一个template,我有方法T get(int i)set(int i, T val)。我必须使特征类改变的不是行为,而是改变的set争论get

template<typename T,int Roz>
class Wektor{
public:
 T tab[Roz];
 T get(int i)
 {
     return tab[i];
 }
 void set(T val,int i)
 {
     tab[i]=val;
 }
 }

所以traits类必须改变get和set。如果 T 是 int 或 double 我们通过复制 int 获得参数

 int get(int i);
 void set(int val,int i);

双倍的

 double get(int i);
 void set(double val,int i);

对于其他类型:

T* get(int i);
void set(T* val,int i);

我们必须在特征中做到这一点,而不是通过模板的专门化。

所以我这样写 tratis:

template<typename T,int Roz>
class traitsWektor
{
public:
T tab[Roz];
T get(int i)
{
    return tab[i];
}
void set(T val,int i)
{
    tab[i]=val;
}
}

所以我在这里卡住了。我想我应该做

template<typename T, int Roz>
class Wektor : public traitsWektor<T,Roz>

但我不确定这是否正确,仍然是 tratis。

4

3 回答 3

4

您应该将类​​模板(Wektor)和参数类型推导分开:

template <class T>
struct WektorParamTraits {
  typedef T const& type;

  //or if you might have different types as getter return type and setter arg
  typedef T const& getterReturn;
  typedef T const& setterArg;
};

在这种情况下, T 是您的 getter/setter 参数的“默认”类型。将其专门用于您需要的任何类型。类定义现在应该如下所示:

template<typename T,int Roz>
class Wektor{
  T tab[Roz]; //make member variables private
public:
  typename WektorParamTraits<T>::getterReturn get(int i) //const?
  {
    return tab[i];
  }

  void set(typename WektorParamTraits<T>::setterArg val,int i)
  {
    tab[i]=val;
  }
};

更新:如评论中所述,您可能需要为 get 和 set 定义其他实现,例如,如果您的返回类型是指针。有几种不同的方法可以做到这一点:

  1. tab[i]在特征中定义函数以在和参数/返回值之间正确转换。
  2. 如果它只是关于指针和非指针,请提供两个版本的 getter 和 setter,并使用std::enable_ifwithstd::is_pointer以及禁用其中一个所需的任何其他内容。
  3. 使用您在此处发布的简单类定义,并将其专门用于不使用通常引用的少数类型。任何进一步的功能都应该进入一个非专业的子类。

方法 2 会非常冗长且难以阅读。方法 1 也很冗长,因为除了数组定义之外,您几乎可以将所有内容委托给该特征类,因此您也可以使用方法 3,因为这并不太远。

于 2013-04-15T11:33:28.400 回答
0

我认为这个模板可以帮助你:

template<typename T>
class traits
{
public:
    typedef T * result;
};

template<>
class traits<int>
{
public:
    typedef int result;
};

template<>
class traits<double>
{
public:
    typedef double result;
};


traits<int>::result; // is int.
traits<char>::result; // is char *.
于 2013-04-15T11:40:49.957 回答
0

我不确定你想如何实现set(T*,int)。但get你可能想试试这个

template<typename T, size_t Roz>
class Wektor
{
public:
    template<typename U=T>
    typename std::enable_if<std::is_arithmetic<U>::value, U>::type 
        Get(size_t n)
    { 
        return tab[n];
    }

    template<typename U=T>
    typename std::enable_if<!std::is_arithmetic<U>::value, U*>::type 
        Get(size_t n)
    { 
        return &tab[n];
    }

    T tab[Roz];
};
于 2013-04-15T11:41:35.123 回答