没有模板参数的模板函数类型

时间:2017-06-04 15:29:14

标签: c++

我有一些模板超过四个参数:

  1. 浮点类型
  2. 浮动类型的SIMD向量长度
  3. SoA(数组结构)长度
  4. 是否使用12参数表压缩(某些算法差异)。
  5. 单元测试如下所示:

    #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,soalencompress12,我们必须使用它们 一种结构。

    我想把它抽象出来。理想情况下是这样的:

    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的类型?

0 个答案:

没有答案