我喜欢Python的一个方面是customize attribute access的方式:
class Foo(object):
def __getattr__(self, name):
if some_predicate(name):
# ...
else:
# Default behaviour
raise AttributeError
我的问题是:你怎么能在C ++中实现类似的东西?超载'。'运算符是一种方法,但它在C ++中是不允许的。
答案 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_;
};