2015-09-04 3 views
1

В отличие от класса аргументы шаблона в , которые должны быть определены пользователем шаблона, функция аргументы шаблона в выводятся компилятором. Поэтому возникает естественный вопрос: почему можно указать по умолчанию аргументы шаблона функции?Каковы использование аргументов шаблона функции по умолчанию

Одно использование, которое я могу придумать, - это когда мы хотим заставить некоторые аргументы шаблона функции, не указывая их всех. Тем не менее, это, похоже, является поворотным. Есть ли другие случаи?

+2

«аргументы шаблона функции выводятся компилятором». [Или нет] (http://en.cppreference.com/w/cpp/memory/shared_ptr/make_shared). –

+0

Я был в середине написания ответа, когда это было опубликовано :) – AlwaysLearning

ответ

0

Это может быть частичный ответ. Один из вариантов использования, о котором я думал, - это когда у нас есть параметр шаблона, который не отображается как тип в списке параметров функции и поэтому не может быть выведен. Предоставление аргумента по умолчанию для этого параметра шаблона может быть очень разумным. Вышеприведенный комментарий n.m. является хорошим примером такого использования.

-1

Пример:

template <typename Y, typename Y, int Z> 
class Do{}; 

X, Y, Z, являются параметры шаблона.

Пользователь может использовать это как:

Do<int,int,1> doit; 

При использовании шаблона класса не существует никакого способа, которым параметры шаблона получить выведены из аргумента функции.

Вы называете что-то «по умолчанию» аргументы ...

template <typename Y, typename Y, int Z=9> 
class Do{}; 

Здесь Z по умолчанию настроен на 9, если ничего не было дано с помощью кода, как:

Do<int,int> doit; 

И если ваши аргументы шаблона могут можно вывести из аргументов функции, возможно, пользователь может использовать специальный экземпляр шаблона, например:

template <typename T> 
void func(const T&); 

    template<> 
void func(const int&) 
{ 
    std::cout << "int in use" << std::endl; 
} 

template<> 
void func(const double&) 
{ 
    std::cout << "double in use" << std::endl; 
} 

int main() 
{ 
    func(3.4); // calls double 
    func<int>(3.4); //calls int 
} 
+0

Вопрос был о ** функции ** шаблонов. – AlwaysLearning

+0

Большое спасибо! Пример с заданными вручную аргументами точно соответствует шаблону функции! И использование его для шаблонов классов или функций здесь одинаково ... не имеет значения! Получайте удовольствие :-) – Klaus

0

Попробуйте конвертировать ниже func в constructor (у них нет типа возврата).

template<class T> 
    typename std::enable_if< std::is_fundamental<T>::value >::type func(T p_arg){} 

    template<class T> 
    typename std::enable_if< !std::is_fundamental<T>::value >::type func(T const &p_arg){} 

Его довольно легко с аргументами шаблона функции по умолчанию.

+0

Мне не очень ясно, чего вы пытаетесь достичь. Не могли бы вы помочь мне, выполнив последнее предложение с кодом? – AlwaysLearning

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