因此原始的Getter / Setter类似于以下样式(添加了其他强制类型转换,也请记住,在这些示例中我使用的是int和float,可能是更复杂的数据)
struct JustAnInteger {
int i;
};
class Foo {
private:
int _bar;
public:
Foo(int bar) : _bar(bar) {}
void setBar(int bar) { _bar = bar; }
int getBar() const {
return _bar;
}
double getBarDouble() const {
return (double)_bar;
}
std::string getBarString() const {
return std::to_string(_bar);
}
JustAnInteger getBarJustAnInteger() const {
return JustAnInteger{ _bar };
}
};
会通过以下方式改变一个好主意还是一个坏主意?
class Foo {
private:
int _bar;
public:
Foo(int bar) : _bar(bar) {}
void bar(int bar) { _bar = bar; }
template <class T = int> //int is the original type
T bar() const;
template <>
int bar<int>() const {
return _bar;
}
template <> double bar<double>() const {
return (double)_bar;
}
template <> std::string bar<std::string>() const {
return std::to_string(_bar);
}
template <> JustAnInteger bar<JustAnInteger>() const {
return JustAnInteger{ bar() };
}
};
通过这种方式,可以轻松地将_bar的类型更改为浮点型
class Foo{
private:
float _bar;
public:
Foo(int bar) : _bar((float)bar) {}
Foo(float bar) : _bar(bar) {}
void bar(int bar) { _bar = (float)bar; }
void bar(float bar) { _bar = bar; }
template <class T = int>
T bar() const;
template <> int bar<int>() const {
return (int)_bar;
}
template <> double bar<double>() const {
return (double)_bar;
}
template <> std::string bar<std::string>() const {
return std::to_string(_bar);
}
template <> JustAnInteger bar<JustAnInteger>() const {
return JustAnInteger{ bar() };
}
};
并且不应破坏代码的其他部分
Foo foo(2);
foo.bar(2.999f); //Now we can use floats!
int a = foo.bar(); //Still an int
double b = foo.bar<double>(); //can keep using it, and we gain precision