Параметры пересылки в диспетчеризации тегов
Я пишу функцию для привязки параметров 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)
,