当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)
而无需更改函数名?
说明:就我而言,这两个函数作为同一对标头和实现文件的一部分在库中提供。然后将其包含(用于模板)并链接(用于专业化)。
答案 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;
}
答案 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;
}