2015-11-28 2 views
3

Предположим, у меня есть шаблон функции, как это:Полная specializtion функции шаблона для возвращаемого значения шаблона

template <typename Key> 
Key foo(const string &name); 

Я знаю, что, специализирующимся функции шаблона, мы должны полностью специализироваться это так:

template<> 
int foo<int>(const string &name); 

Но теперь я ищу способ, чтобы специализироваться эту функцию для объекта шаблона, что-то вроде этого:

template<> 
Bar<Key> foo<Bar<Key>>(const string &name); 

Я думаю, что это не нарушало бы законы C++ 11 для специализации и переопределения функций. Но все же я не мог найти способ сделать это.

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

Edit:

Функция, которую я упомянул в качестве примера специализации не имеет правильный синтаксис, поскольку он имеет неопределенный тип Key. Я просто пишу это, чтобы показать, что нет возможного решения. Если я пытаюсь полностью определил его как:

template<typename Key> 
Bar<Key> foo<Bar<Key>>(const string &name); 

компилятор не может скомпилировать его, так как предполагается в качестве частичной функции специализации.

+0

Почему специализироваться? Вы не можете перегрузить его? –

+0

Входной параметр одинаковый во всех функциях. Как я могу перегрузить его? – MohsenTamiz

+0

Какие ошибки вы получаете? – sergico

ответ

1

Существует способ перегрузки (вместо специализации) foo с enable_if магия.

template <typename Key> 
typename std::enable_if<!is_specializaton<Bar, Key>::value, Key>::type 
foo(const string &name); 

template<typename KeyCont> 
typename std::enable_if<is_specializaton<Bar, KeyCont>::value, KeyCont>::type 
foo(const string &name); 

где is_specialization может быть определена следующим образом:

template <template<typename...> class T, typename ... args> 
struct is_specializaton { 
    static const bool value = false; 
}; 

template <template<typename ... > class a, typename ... args > 
struct is_specializaton<a, a<args...>> { 
    static const bool value = true; 
}; 
+0

Работает очень хорошо. Это было красивое решение, но я немного изменил его, и я использовал шаблонный класс 'is_bar ', который указывает, что это класс бара или нет, потому что у меня есть еще одна специализация для этой функции, и я думаю, что этот способ упрощает , – MohsenTamiz