C ++相当于Python的__getattrr __(self,name)

时间:2014-11-01 15:32:40

标签: c++

我喜欢Python的一个方面是customize attribute access的方式:

class Foo(object):
    def __getattr__(self, name):
        if some_predicate(name):
            # ...
        else:
            # Default behaviour
            raise AttributeError

我的问题是:你怎么能在C ++中实现类似的东西?超载'。'运算符是一种方法,但它在C ++中是不允许的。

2 个答案:

答案 0 :(得分:3)

如果没有一些模板/宏观魔法,主要想法(即动态提供属性/功能)似乎是不可能的 - 而且仍然不是运行时。

我能想象到的最接近的是overloading the -> operator。例如std::unique_ptr<T, Deleter>就是这样做的。另一种方法是重载the [] operator - std::map<Key, T, Compare, Allocator>是最值得注意的例子。

答案 1 :(得分:2)

真正的答案:Python不是C ++。 Pythonic就是这样的东西,但即使你可以用C ++来做,那将是糟糕的C ++代码。

但如果你真的想...... Python中的所有东西都只是一本字典。你总是可以......用C ++重写python ......(技术上这是__getitem__但是没有办法做__getattr__)。

class Foo {
public:
    Object* operator[](const std::string& name) 
    {
        if (some_predicate(name)) {
            // ...
        }
        else {
            throw std::runtime_error(); // or something
        }
    }

private:
    std::map<std::string, Object*> dict_; 
};