我不熟悉模板,但我想知道是否可以将它们用于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_)。有没有一种更优雅的方式来编写这些函数,或者在这种情况下像上面这样做是一种常见的做法?如果经常使用模板,我会很欣赏你如何在上面的代码中使用它们的例子。
我要问的另一个问题是,应该如何正确声明getter和setter。它的编码风格好吗?
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应该作为对对象的参数引用,而不是复制它,这可能会慢一点?
发布于 2010-11-16 23:50:37
哈罗,反对者!
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;
};发布于 2010-11-16 22:30:52
以较少需要getter和setter的方式设计您的程序。您可以通过宏创建它们,或者实现某种属性语法(这是可能的,但总会有一些东西不能正常工作)。但是,我认为在需要时编写访问器或使用IDE生成访问器是最好也是最常用的方法。
至于你的第二个问题,你应该至少在对象类型中使用它,对于原语来说你并不真正需要它。就我个人而言,如果我无论如何都需要对象的副本,我也不会使用它,但是其他人可能会说,显式地这样做可能会更好。
发布于 2010-11-16 22:43:36
我看不到直接帮助您压缩getter/setter对的模板化方法,除非您想将成员包装在模板化的访问器类中,如this。另一种可能是使用#define宏来模拟C#属性(如果宏不会吓到您或任何阅读您代码的人)。
getters是否返回(const)对成员的引用,返回指向成员的指针,还是复制它们取决于几个因素。您必须考虑复制它们是否代价高昂(性能方面),复制它们在语义上是否有意义,以及您返回的信息是否有可能比您从中获取它的类更持久(如果您返回一个指向成员的指针/引用,那么一旦删除对象,它就会悬空)。如果你想允许成员为空的可能性,我会使用指针而不是引用。
对于getter,我倾向于为任何东西返回const引用,除了我复制的原语。对于setter,通常会有一个const引用参数。
https://stackoverflow.com/questions/4195100
复制相似问题