Я хочу, чтобы усовершенствовать форвардный аргумент производному классу через базовый класс. Единственная идея, которую я имею, - реализовать не виртуальную совершенную функцию пересылки в базовом классе и перегружать виртуальные функции для lvalues
и 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?
Если вам нужен динамический полиморфизм, вам понадобится виртуальный вызов в какой-то момент, и функциональные шаблоны не могут быть виртуальными, конечно. Вы можете иметь шаблонную функцию в 'производном_t', которая может быть вызвана из обеих перегрузок в производном классе. – Pixelchemist
Кажется, что предоставление двух перегрузок для виртуальной функции в базовом классе является самым простым способом :( – user1641854
Вы можете просто использовать 'virtual void process (std :: string value)'. – Simple