vendredi 1 janvier 2021

Is function template specialization really allowed?

As per the article(https://www.learncpp.com/cpp-tutorial/partial-template-specialization/), which says that[emphasize mine]:

Partial template specialization allows us to specialize classes (but not individual functions!)

It seems that function partcial template specialization is not allowed.Is it really correct?

What confuses me is that why these code snippets could be compiled successfully:

//demo1.cpp
//first code snippet(https://coliru.stacked-crooked.com/a/0868610b5be94f2c)
//Why this fucntion template specialization compiles? 
//Because this is full template specialization other than partcial template specialization?Am I right?
#include <iostream>
#include <string.h>
using namespace std;

template <class T>
void f(T)
{ 
    T d; 
    std::cout <<"first one" << std::endl;
}
    
template <>
void f<int>(int)
{ 
    int d;
    std::cout <<"second one" << std::endl;
}

int main() 
{
    f(5.0);
    f(1);
    f('a');
}

Another example:

//demo2.cpp(https://coliru.stacked-crooked.com/a/7b1a94ad377ac1f6)
//Why this fucntion template specialization compiles? 
//I think it's function partcial template specialization indeed.
#include <vector>
#include <iostream> 
using namespace std;

//function template
template<typename T, class N> void compare(T num1, N num2) {
    cout << "standard function template" << endl;
    if(num1>num2)
        cout << "num1:" << num1 << " > num2:" << num2 <<endl;
    else
        cout << "num1:" << num1 << " <= num2:" << num2 << endl;
}

//function partcial template specialization
template<class N> void compare(int num1, N num2) {
    cout<< "partitial specialization" <<endl;
    if (num1>num2)
        cout << "num1:" << num1 << " > num2:" << num2 << endl;
    else
        cout << "num1:" << num1 << " <= num2:" << num2 << endl;
}

int main() {
    compare<int,int>(30,31);//call compare<int,int>(int num1, int num2)
    
    compare(5,9);           //call compare<int>(int num1, int num2)

    compare(30,'1');        //call compare<char>(int num1, char num2)

}

Why this code snippet could not been compiled(https://coliru.stacked-crooked.com/a/dd3ad66acc4cb871) whereas the aforementioned two code snippets compile successfully?

#include <vector>
#include <iostream> 
using namespace std;

template <class T1, class T2>
void f(){}
    
template <class T2>
void f<int, T2>(){}  //It's function template sepcialization, isn't it? Why it could not be compiled?

int main() {}

Here are the error messages:

main.cpp:9:6: error: non-type partial specialization 'f<int, T2>' is not allowed
    9 | void f<int, T2>(){}
      |      ^~~~~~~~~~

Aucun commentaire:

Enregistrer un commentaire