使用功能模板代替模板专门化

时间:2018-12-03 10:26:26

标签: c++ templates

当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 个答案:

答案 0 :(得分:7)

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

#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

答案 1 :(得分:2)

第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;
}