带有函数指针的模板类的模板函数

时间:2016-04-22 23:18:40

标签: c++ templates operator-overloading function-pointers

我找到了一些不错的属性模板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;运算符,但是当涉及函数指针时,我无法弄清楚如何制作模板模板。

1 个答案:

答案 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