我不熟悉模板,但我想知道,是否可以将它们用于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将参数作为对象的参数引用,而不是复制它,这可能会慢一些吗?
答案 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)
不,你不能定义任何类型的模板,它可以使用无限制的名称集创建函数或类似函数的东西,如getA
,getB
,....
宏可以做到,但这是一个更糟糕的想法。
我通常通过const引用传递/返回一个类对象,但只有值double
的简单内置类型:
public:
const ClassType& getObj() const;
void setObj(const ClassType& obj);
double getNum() const;
void setNum(double num);