我有一些模板超过四个参数:
单元测试如下所示:
#if defined(QPHIX_SCALAR_SOURCE)
if (precision == FLOAT_PREC) {
if (compress12) {
runTest<float, 1, 1, true, UF, PhiF>();
} else {
runTest<float, 1, 1, false, UF, PhiF>();
}
}
if (precision == DOUBLE_PREC) {
if (compress12) {
runTest<double, 1, 1, true, UF, PhiF>();
} else {
runTest<double, 1, 1, false, UF, PhiF>();
}
}
#else
if (precision == FLOAT_PREC) {
#if defined(QPHIX_AVX_SOURCE) || defined(QPHIX_AVX2_SOURCE) || \
defined(QPHIX_MIC_SOURCE) || defined(QPHIX_AVX512_SOURCE) || \
defined(QPHIX_SSE_SOURCE)
if (compress12) {
runTest<float, VECLEN_SP, 4, true, UF, PhiF>();
} else {
runTest<float, VECLEN_SP, 4, false, UF, PhiF>();
}
#if !defined(QPHIX_SSE_SOURCE)
if (compress12) {
runTest<float, VECLEN_SP, 8, true, UF, PhiF>();
} else {
runTest<float, VECLEN_SP, 8, false, UF, PhiF>();
}
#endif
还有其他一些看起来有些类似的情况。自模板
参数必须在编译时知道,但我们希望允许用户
在运行时选择float,soalen
和compress12
,我们必须使用它们
一种结构。
我想把它抽象出来。理想情况下是这样的:
call(runTest, prec, veclen, soalen, compress12);
也许人们需要使用模板,所以它可能就是这样:
call<ThisClass::runTest>(prec, veclen, soalen, compress12);
我的实现理念类似于以下内容,但我没有
知道Function
应该是什么。
enum Precision {
prec_half,
prec_float,
prec_double
}
template <Function func>
void call(Precision prec, int veclen, int soalen, bool compress12)
{
if (prec == prec_half) {
// More nested `if` constructs for `veclen`, `soalen`, ...
func<half>();
} else if (prec == prec_float) {
func<float>();
} else {
func<double>();
}
}
有没有办法获取成员函数模板并将其传递给某些东西
没有具体的模板参数?我可以肯定通过
ThisClass::runTest<float, 1, 1, false>
因为那是一种明智的类型。什么
是ThisClass::runTest
的类型?