Параметры пересылки в диспетчеризации тегов

Я пишу функцию для привязки параметров SQL и хочу использовать диспетчеризацию тегов. Итак, я написал этот код:

class OraclePreparedStatement
{
public:
    template<typename T>
    void bind_param(uint32_t col_index, T&& param)
    {
        bind_param_impl(col_index, std::forward(param), 
                        std::is_integral<std::remove_reference_t<T>>());
    }

private:
    template<typename T>
    void bind_param_impl(uint32_t col_index, T&& param, std::true_type)
    {
        statement->setNumber(col_index, oracle::occi::Number(param));
    }

    template<typename T>
    void bind_param_impl(uint32_t col_index, T&& param, std::false_type)
    {
        statement->setString(col_index, std::forward(param));
    }

    OracleConnection::StatementWrapper statement;
};

И тогда я написал следующий клиентский код, чтобы проверить это:

OraclePreparedStatement stmt;
auto col_index = 1;
stmt.bind_param(col_index++, 15);
stmt.bind_param(col_index++, std::string("test string"));

Но он не компилируется. Оба вызова метода bind_param вызывают ошибки компиляции:

ошибка: не найдена соответствующая функция для вызова функции forward(int&)
ошибка: не найдена соответствующая функция для вызова функции forward(std::basic_string&)

Почему пересылка параметров не компилируется?

2 ответа

Решение

std::forward намеренно написан таким образом, что вы должны явно указать аргумент шаблона - он не может работать без этого. Так что просто сделай так:

bind_param_impl(col_index, std::forward<T>(param), 
                std::is_integral<std::remove_reference_t<T>>());

а также

statement->setString(col_index, std::forward<T>(param));

Причина в том, что для std::forward чтобы работать, нужно знать, T сама была ссылкой или нет. Обратите внимание, что с param всегда lvalue, нет пути std::forward может быть написано без предоставления вам явного доступа к T,

Вы должны передать выведенный тип std::forward(), В вашем случае вы бы использовали std::forward<T>(param),

Другие вопросы по тегам