我有一个类FooBar
,其中包含Foo
类型的成员。可以继承此类型,以便FooBar
具有可变行为。 Foo
包含访问者方法bar
的多个重载。
class FooBar;
class Foo{
friend class FooBar;
virtual void bar(int barIn){ bar_ = barIn; }
virtual void bar(int barIn, float barScale){ bar(int(barIn * barScale)); }
virtual void bar(const Foo& barSource){ bar(barSource.bar_); }
int bar(){ return bar_; }
int bar_;
};
class FooBar{
public:
void bar(int barIn){ foo_.bar(barIn); }
void bar(int barIn, float barScale){ foo_.bar(barIn, barScale); }
void bar(const Foo& barSource){ foo_.bar(barSource); }
int bar(){ return foo_.bar(); }
private:
Foo& foo_;
};
到目前为止看起来还不错,但我觉得FooBar.bar
访问器的所有定义都没有必要。我知道编译器会内联它们,所以应该没有开销,但这些方法都有相同的名称,并且都是彼此重载。
在C ++中是否有一种方法可以导出"导出" (我还没有找到更好的词)访问者所以对FooBar.bar
的来电只是重定向到FooBar.foo_.bar
?
我有一个想法是覆盖operator ->
的{{1}},但真实案例有多个类FooBar
,所以这只适用于其中一个。
答案 0 :(得分:4)
你可以写一个真正的通用转发器:
class FooBar
{
public:
template<typename... Args>
auto bar(Args&&... args) -> decltype(foo_.bar(std::forward<Args>(args)...))
{
return foo_.bar(std::forward<Args>(args)...);
}
private:
Foo& foo_;
};
(这需要C ++ 11,使用C ++ 14,你甚至可以省略->decltype...
部分)