1

我正在編寫綁定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&)'

爲什麼轉發參數無法編譯?

回答

1

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

+0

哦,當然,我有代碼錯誤型,我沒有認出。謝謝。 –

0

您需要將推導出的類型傳遞給std::forward()。在你的情況下,你會使用std::forward<T>(param)