2016-12-25 12 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); 
} 

、これは非常に迷惑です。すべての議論を進める良い方法はありますか?次のコードは、例えば、SFINAEは役立つかもしれない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

で、残念ながら動作しません:式が有効であるかどう

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

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

は今、この過負荷にのみ適用されます。

シグネチャが重複し、複数のオーバーロードが有効であるなどの問題がありますが、これが出発点です。

関連する問題