我希望能够通过基类完善前向派生类的参数。我唯一的想法是在基类中实现非虚拟完美转发功能,并为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;
}))
}
?
答案 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
派生而来,您将获得完美的转发界面。