安装者和吸气剂的模板

时间:2010-11-16 14:23:32

标签: c++ templates setter getter

我不熟悉模板,但我想知道,是否可以将它们用于setter和getter方法。例如,在这种情况下:

double exmlClass::getA(void) const
{
    return a_;
}



void exmlClass::setA(const double& a)
{
    a_ = a;
}



double exmlClass::getB(void) const
{
    return b_;
}

如您所见,方法几乎相同,除了它们引用另一个私有变量(a_,b_,c_)。是否有更优雅的方式来编写这些函数,或者在这种情况下通常如上所述?如果它常用于使用模板,我会很感激你如何在上面的代码中使用它们。

我要问的另一个问题是如何恰当地宣布吸气剂和制定者。编码风格好吗?

double getA(void) const;
void setA(const double& a);

double getB(void) const;
void setB(const double& b);

double getC(void) const;
void setC(const double& c);

我的意思是,getter总是const并且setter将参数作为对象的参数引用,而不是复制它,这可能会慢一些吗?

6 个答案:

答案 0 :(得分:4)

Haro对反对者!

Boost.Fusion.Map正是您所寻找的基础。

namespace result_of = boost::fusion::result_of;

class MyClass
{
public:
  struct AType {};
  struct BType {};
  struct CType {};

  template <typename Type>
  typename result_of::at< DataType, Type >::type &
  access(Type) { return boost::fusion::at<Type>(mData); }

  template <typename Type>
  typename result_of::at< DataType, Type >::type const &
  get(Type) const { return boost::fusion::at<Type>(mData); }

  template <typename Type>
  void set(Type, typename result_of::at< DataType, Type >::type const & v)
  {
    boost::fusion::at<Type>(mData) = v;
  }

private:
  typedef boost::fusion::map <
    std::pair<AType, int>,
    std::pair<BType, std::string>,
    std::pair<CType, float> > DataType;
  DataType mData;
};

答案 1 :(得分:2)

以某种方式设计您的程序,减少对getter和setter的需求。 您可以通过宏创建它们或实现某种属性的合成(这是可能的,但总有一些东西不能正常工作)。 但是,我想只需在需要时编写访问器或使用IDE生成访问器是最好也是最常用的方法。

至于你的第二个问题,你应该至少使用它作为对象类型,你真的不需要它用于原语。就个人而言,如果我还需要该对象的副本,我也不会使用它,但是其他人可能会声称这样做可能更好。

答案 2 :(得分:0)

除非你想把你的成员包装在像this这样的模板化访问器类中,否则我无法看到一种模板方法来直接帮助你使你的getter / setter对变得紧密。另一种可能性是使用#define宏来模拟C#属性(如果宏不会吓到你或任何人读你的代码)。

getter是否返回(const)对成员的引用,返回指向成员的指针,还是复制它们取决于几个因素。您必须考虑复制它们是否成本高昂(性能明智),是否在语义上有意义来复制它们,以及您返回的信息是否应该可以比您的课程更长重新获取它(如果你返回一个成员的指针/引用,它会在你删除你的对象后立即悬空)。如果你想允许成员为null,我会在引用上使用指针。

对于getter,我倾向于返回const引用,除了我复制的原语。对于setter,通常有一个const引用参数。

答案 3 :(得分:0)

技术上可以创建单个exmlClass::set<PMF>函数模板,使exmlClass::set<&exmlClass::a_>有效。但是,重点是什么?

答案 4 :(得分:-1)

理论上,你可以:

template<typename A, typename B, typename C>
class Object
{
private:
    A _a;
    B _b;
    C _c;

public:
    Object()
    {
    };  // eo ctor

    // properties

    A getA() const {return(_a);}
    void setA(const A& _val) {_a = _val;}

    // etc for B & C
}; // eo class Object

    // .....

    Object<int, double, char> myObject;

我看到有几个问题。首先,getters / setter不应该是他们向你的班级用户传达的东西。你打算把这个叫做getter / setters?得到() ? getAValue()?这甚至意味着什么?

其次,这定义了3.对象需要多少? 1,2,4,9?

第三,Getters / setters应根据其功能正确命名:

getName()
getAddress()
getMovie()

听起来你只想节省打字,绝不是让你的设计复杂化的借口。

关于你的第二点,返回对象的引用(const,最好),但不要打扰小的,完整的POD(普通旧数据)类型,如int,char,bool etcteras。

答案 5 :(得分:-1)

不,你不能定义任何类型的模板,它可以使用无限制的名称集创建函数或类似函数的东西,如getAgetB,....

宏可以做到,但这是一个更糟糕的想法。

我通常通过const引用传递/返回一个类对象,但只有值double的简单内置类型:

public:
  const ClassType& getObj() const;
  void setObj(const ClassType& obj);
  double getNum() const;
  void setNum(double num);