2016-12-25 49 views
1

數字庫通常具有類型指定的函數,函數名稱和參數幾乎相同,例如cblas_[sdcz]gemm,具體取決於輸入類型。要允許函數重載,因此通過cblas_tgemm打電話,我寫的這些功能的包裝,如:爲模板函數轉發參數

inline 
void cblas_tgemm(const CBLAS_LAYOUT Layout, const CBLAS_TRANSPOSE TransA, 
       const CBLAS_TRANSPOSE TransB, const INT M, const INT N, 
       const INT K, const float alpha, const float *A, 
       const INT lda, const float *B, const INT ldb, 
       const float beta, float *C, const INT ldc) 
{ 
    cblas_sgemm(Layout, TransA, 
       TransB, M, N, 
       K, alpha, A, 
       lda, B, ldb, 
       beta, C, ldc); 
} 
inline 
void cblas_tgemm(const CBLAS_LAYOUT Layout, const CBLAS_TRANSPOSE TransA, 
       const CBLAS_TRANSPOSE TransB, const INT M, const INT N, 
       const INT K, const double alpha, const double *A, 
       const INT lda, const double *B, const INT ldb, 
       const double beta, double *C, const INT ldc) 
{ 
    cblas_dgemm(Layout, TransA, 
       TransB, M, N, 
       K, alpha, A, 
       lda, B, ldb, 
       beta, C, ldc); 
} 

顯然,這是很煩人的,因爲我需要遍歷所有的函數參數。有沒有更好的方法來轉發所有參數?下面的代碼,例如,不遺憾的是工作,具有error: redefinition of ‘template<class ... Params> void {anonymous}::cblas_tgemm(Params&& ...)’

template <typename ...Params> 
void cblas_tgemm(Params&&... params) 
{ 
    cblas_sgemm(std::forward<Params>(params)...); 
} 
template <typename ...Params> 
void cblas_tgemm(Params&&... params) 
{ 
    cblas_dgemm(std::forward<Params>(params)...); 
} 

回答

2

SFINAE可能幫助:

#define RETURNS(...) \ 
    -> decltype(__VA_ARGS__)\ 
    { return __VA_ARGS__; } 

template <class ...Params> 
auto cblas_tgemm(Params&&... params) 
RETURNS(cblas_sgemm(std::forward<Params>(params)...)) 

現在這個過載如果表達式是有效的只適用。

可能存在重複簽名和多重過載有效等問題。但這是起點。