功能模板专业化的重要性和必要性

sky*_*oor 6 c++ template-specialization

我读过C++ Primer,它说功能模板专业化是一个高级主题,但我完全迷失了.任何人都可以提供一个例子,为什么功能模板专业化是重要和必要的?

为什么功能模板不支持类模板的部分专业化?底层逻辑是什么?

Jag*_*ath 8

您可以在此处回答有关函数不支持部分特化的原因的问题.下面的代码显示了如何实现不同的专业化.

template<typename T>
bool Less(T a, T b)
{
    cout << "version 1 ";
    return a < b;
}
// Function templates can't be partially specialized they can overload instead.
template<typename T>
bool Less(T* a, T* b)
{
    cout << "version 2 ";
    return *a < *b;
}

template<>
bool Less<>(const char* lhs, const char* rhs)
{
    cout << "version 3 ";
    return strcmp(lhs, rhs) < 0;
}

int a = 5, b = 6;

cout << Less<int>(a, b) << endl;
cout << Less<int>(&a, &b) << endl;
cout << Less("abc", "def") << endl;
Run Code Online (Sandbox Code Playgroud)


dsi*_*cha 0

基本上,这个想法是您可以编写针对一般情况以通用方式运行的模板,但仍然可以处理特殊情况。使用专业化的一个例子是在std::vector. std::vector<bool>是一种特殊化,它将bool元素打包成每个元素仅使用一位,而不是一个字节。 std::vector<T>对于所有其他类型,其工作方式与普通动态数组类似。

专业化更高级的用途是元编程。例如,这里有一个示例(来自维基百科),说明如何使用模板专门化在编译时计算阶乘。

template <int N>
struct Factorial 
{
    enum { value = N * Factorial<N - 1>::value };
};

template <>
struct Factorial<0> 
{
    enum { value = 1 };
};
Run Code Online (Sandbox Code Playgroud)

  • 不是被问及的*函数*模板专业化。 (8认同)
  • 必须同意罗杰·佩特的观点,抱歉,-1。 (4认同)