2014-02-06 3 views
1

Я читал этот учебник:Тип шаблона параметров (шаблоны функций): C++

http://www.learncpp.com/cpp-tutorial/144-expression-parameters-and-template-specialization/

и это было упомянуто However, template type parameters are not the only type of template parameters available. Template classes **(not template functions)** can make use of another kind of template parameter known as an expression parameter.

Так что я написал программу:

#include <iostream> 

using namespace std; 

    template<typename T,int n> 
    bool Compare(T t,const char* c) 
    { 
    if (n != 1) 
    { 
    cout << "Exit Failure" << endl; 
    exit(EXIT_FAILURE); 
    } 

    bool result=false; 
    cout << c << endl; 
    cout << t << endl; 
    cout << t.compare(c) << endl; 
    if(t.compare(c) == 0) 
    result = true; 

    return result; 
    } 




int main() 
{ 
    string name="Michael"; 

    if (Compare<string,1>(name,"Sam")) 
    cout << "It is Sam" << endl; 
    else 
    cout << "This is not Sam" << endl; 
    return 0; 
    } 

И получил:

$ ./ExpressionParameter 
Sam 
Michael 
-1 
This is not Sam 

Очевидно, здесь параметр шаблона принимает int n как expression parameter. Таким образом, точка, упомянутая в учебнике Template classes (not template functions) can make use of another kind of template parameter known as an expression parameter., кажется неправильной.

Далее чтение на

Non-type template parameters

также показывают то же самое.

Итак, я понял, что: независимо от того, является ли это шаблоном функции или шаблоном класса, параметр шаблона может быть template type parameter i.e. typename или expression parameter. Единственное ограничение состоит в том, что для параметра выражения - это должно быть constant integral expression. Компилятор не различает, если он равен function или class.

Правильно ли я понимаю?

+2

Я никогда не слышал о том, что шаблон функции не может иметь параметры не-типа. – chris

ответ

1

Да, вы понимаете это правильно.

Один из вариантов использования - это создать общий код, но при этом получить преимущества постоянной времени компиляции (например, улучшить оптимизацию компилятора).

Один пример: std::array, который принимает такой шаблон size_t параметр для его длины. Другим примером является std::enable_if, который использует bool.

Смежные вопросы