如何"出口" c ++中一个函数的所有重载?

时间:2014-05-03 10:59:59

标签: c++ override overloading accessor

我有一个类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,所以这只适用于其中一个。

1 个答案:

答案 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...部分)