代码之家  ›  专栏  ›  技术社区  ›  apalomer

使用函数模板而不是模板专门化

  •  2
  • apalomer  · 技术社区  · 6 年前

    当Intel内部计算可用时,我专门设计模板函数。在我的例子中,SSE和AVX。我想制作一个测试程序,在这个程序中,我校准非专用模板函数和专用模板函数来比较性能。但是,我不知道如何为专门化的类型调用非专门化的模板函数。

    下面是一个简单的例子:

    #include <iostream>
    
    template <typename T>
    void f(T val)
    {
      std::cout << "Template function. Value: " << val << std::endl;
    }
    
    template <>
    void f(float val)
    {
      std::cout << "Float function. Value: " << val << std::endl;
    }
    
    int main()
    {
      f(1);
      f(1.0f);
      return 0;
    }
    

    问题: 有打电话的方法吗 f(1.0f) 使用非专用模板函数而不更改函数名?

    澄清: 在我的例子中,这两个函数在库中作为同一对头文件和实现文件的一部分提供。然后,这就包含在程序中(对于模板)和链接(对于专门化)。

    2 回复  |  直到 6 年前
        1
  •  7
  •   user7860670    6 年前

    您可以添加一个额外的参数来禁止专门化:

    #include <iostream>
    
    template <typename T, bool enable_specialization = true>
    void f(T val)
    {
      std::cout << "Template function. Value: " << val << std::endl;
    }
    
    template <>
    void f<float, true>(float val)
    {
      std::cout << "Float function. Value: " << val << std::endl;
    }
    
    int main()
    {
      f(1.0f);
      f<float, false>(1.0f);
      return 0;
    }
    

    online compiler

        2
  •  2
  •   Oliv    6 年前

    选项N°2:

    #include <iostream>
    
    template <typename T>
    void f(T val)
    {
      std::cout << "generic" << val << std::endl;
    }
    
    
    void f(float val)
    {
      std::cout << "Target specific" << val << std::endl;
    }
    
    int main()
    {
      f(1); //=> generic
      f(1.0f); //=> target specific
      f<float>(1.0f); //=> generic
      return 0;
    }