gpt4 book ai didi

c++ - 标签分发中的转发参数

转载 作者:行者123 更新时间:2023-11-30 05:33:54 26 4
gpt4 key购买 nike

我正在编写用于绑定(bind) 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 方法都会导致编译错误:

error: no matching function for call to 'forward(int&)'
error: no matching function for call to 'forward(std::basic_string&)'

为什么转发参数编译失败?

最佳答案

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 始终是左值,因此如果不显式授予 T 访问权,就无法编写 std::forward

关于c++ - 标签分发中的转发参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34525726/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com