通过基类完美转发

时间:2016-03-18 08:24:38

标签: c++ c++11 polymorphism perfect-forwarding

我希望能够通过基类完善前向派生类的参数。我唯一的想法是在基类中实现非虚拟完美转发功能,并为rvalues#include <iostream> #include <memory> #include <string> class base_t { public: virtual ~base_t() = default; template<typename T> void perfect_forward(T&& value) { process(std::forward<T>(value)); } protected: virtual void process(const std::string& value) = 0; virtual void process(std::string&& value) = 0; }; class derived_t : public base_t { protected: void process(const std::string& value) override final { std::cout << "derived_t::process(const lvalue&)" << std::endl; } void process(std::string&& value) override final { std::cout << "derived_t::process(rvalue&&)" << std::endl; } }; int main(int argc, const char* argv[]) { const std::string lvalue; auto rvalue = []() { return std::string(); }; std::unique_ptr<base_t> base(new derived_t); base->perfect_forward(lvalue); base->perfect_forward(rvalue()); } 提供虚函数重载。像这样:

考虑:

perfect_forward

但这有一点意义,因为在基类中我不是模板process,而是为虚拟process提供两个重载。如何在std::forward方法的派生类中避免代码重复,并通过base_t接口使用array_merge = function (arr1, arr2) { return arr1.concat(arr2.filter(function(item){ return arr1.indexOf(item) < 0; })) }

1 个答案:

答案 0 :(得分:3)

如果你不想按值std::string取值,有一种方法是使用mixin类,但它需要更改你的类层次结构:

template<class D>
class process_mixin : public base_t {
protected:
    void process(std::string const& value) override final {
        return ((D*)this)->do_process(value);
    }

    void process(std::string&& value) override final {
        return ((D*)this)->do_process(std::move(value));
    }
};

class derived_t : public process_mixin<derived_t> {
protected:
    template<typename T>
    void do_process(T&& value) {
    }

    friend process_mixin<derived_t>;
};

process_mixin只需要写一次。从那时起,base_t派生的任何内容都可以从process_mixin派生而来,您将获得完美的转发界面。