我找到了一些不错的属性模板here。
这些允许我为这样的名字创建一个字符串属性:
class Entity {
const std::string& get_name() const;
const std::string& set_name(const std::string& name);
public:
UnrestrictedProperty<std::string, Entity, &Entity::get_name, &Entity::set_name> name;
...
}
使用此模板:
template <class Type, class Object, const Type&(Object::*real_getter)() const, const Type&(Object::*real_setter)(const Type&)>
class UnrestrictedProperty { ... }
现在我想重载&lt;&lt;运算符,但是当涉及函数指针时,我无法弄清楚如何制作模板模板。
答案 0 :(得分:0)
解决方案可以是声明非成员函数,如下所示:
template <class Type, class Object, const Type&(Object::*real_getter)() const, const Type&(Object::*real_setter)(const Type&)>
std::ostream& operator<<(std::ostream& output, const UnrestrictedProperty<Type, Object, real_getter, real_setter> unrestricted_property) {
return (output << unrestricted_property.get());
}
请注意,这里不需要关键字friend,因为我们使用的是get()方法,这是一个公共成员函数。
此外,通常最好通过const引用返回std::string
之类的复杂对象并避免复制。
我想补充一点,一个不修改对象的方法也必须是const,我在这里谈论get_name
。