2012-05-18 4 views
2

Я искал четкий ответ, и я просто ловил кусочки из Интернета.Явная функция шаблона и метод Специализация

У меня есть функция, и она должна действовать по-разному на основе переменной типа. Функция не принимает аргументов, поэтому перегрузка не работает, что приводит к специализации шаблонов. Например:

//Calls to this function would work like this: 
int a = f(); 
int b = f<int>(); 
int c = f<char>(); 
//... 

Во-первых, это возможно даже синтаксически? Я чувствую, что это так. Продолжение.

У меня возникли проблемы с определением этой функции, потому что я получил зависание в синтаксисе для явной специализации. Я пробовал несколько разных подходов, но мне еще предстоит получить простой пример для работы.

Во-вторых, я пытаюсь (в конечном итоге) сделать эту функцию шаблона в методе шаблона (не шаблонного) класса. Я перейду через этот мост, когда я приду к нему.

Спасибо,
Ian

ответ

3

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

template< typename T > int f(){ ... } 

template<> int f<int>(){ ... } 
template<> int f<char>(){ ... } 

некоторые связанные с чтением: http://www.gotw.ca/gotw/049.htm

+0

Спасибо. Я угадал - попробовал это, но мой линкер продолжал говорить, что есть многозначные символы? – imallett

+0

Вы написали их в заголовке и включены в несколько единиц перевода? Явная специализация функции шаблона подобна регулярной функции в этом смысле. Вам придется либо определить их 'inline', либо в неназванном пространстве имен (эквивалент C++' static'). В противном случае просто объявите их в заголовке и определите их в файле cpp. –

+0

Да в заголовке; но с включением охранников. Мне удалось заставить его работать с неназванным пространством имен xor inlining. Однако, когда я перехожу на вторую проблему (превращая ее в метод), она снова не работает (пытается вставить). Что касается размещения в файле .cpp, у iirc не было проблем с разделением шаблонов из реализации на C++? – imallett

2

Во-первых, в том, что даже синтаксически возможно? Я чувствую, что это так.

Это, но не чрезмерно усложнять – это нужно только простой перегрузки:

int f() 
{ 
    return /* default, typeless implementation */; 
} 

template<typename T> 
int f() 
{ 
    return /* type-specific implementation */; 
} 

template<> 
int f<char>() 
{ 
    return /* char implementation */; 
} 

template<> 
int f<int>() 
{ 
    return /* int implementation */; 
} 
+0

Как определить различные функции для int или char или что-то еще? Сожалею; возможно, я что-то упустил. – imallett

+0

@Ian: Затем вы специализируетесь, как в редактировании, или используете константы 'if' константы времени компиляции внутри основного шаблона. Трудно дать конкретное руководство без конкретной цели ... – ildjarn

+0

«Трудно дать конкретное руководство без конкретной цели». Да; Я обвиняю себя в этом. Ваше редактирование - это в основном то, что мы выяснили.Не понимаю, почему нужна первая не-шаблонная функция. Спасибо за помощь, хотя! – imallett

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