gpt4 book ai didi

c++ - 模板函数的参数转发

转载 作者:行者123 更新时间:2023-11-30 03:35:26 24 4
gpt4 key购买 nike

数值库通常有类型指定的函数,函数名称和参数几乎相同,例如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)...);
}

最佳答案

SFINAE 可能会有所帮助:

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

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

现在此重载仅在表达式有效时适用。

可能存在重复签名和多个有效重载等问题。但这是起点。

关于c++ - 模板函数的参数转发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41319046/

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