2012-07-02 5 views
1

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

template<class T> 
void Foo(T& parameter) 
{ 
    /* some generic - all types - stuff */ 

    If(T is int) // this is pseudo-code, typeinfo? Boost? 
    { 
     /* some specific int processing which might not compile with other types */ 
    } 

    /* again some common stuff */ 
} 

Любые предложения приветствуются. Благодаря

+0

Я редактировал название, потому что термин «частичная специализация» означает нечто совершенно отличное от того, что задают здесь. – bames53

ответ

3

Если вы хотите специализироваться часть функции, то вы просто должны учитывать ту часть функции со специализированными реализациями:

template<class T> 
void Bar(T &t) {} 

void Bar(int &i) { 
    /* some specific int processing which might not compile with other types */ 
} 


template<class T> 
void Foo(T &t) { 
    /* some generic - all types - stuff */ 

    Bar(t); 

    /* again some common stuff */ 
} 
0

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

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

2

Sure:

// helper funciton 
template <class T> 
void my_helper_function(T& v) 
{ 
    // nothing specific 
} 

void my_helper_function(int& v) 
{ 
    // int-specific operations 
} 

// generic version 
template <class T> 
void Foo(T& v) 
{ 
    /* some generic - all types - stuff */ 

    my_helper_function(v); 

    /* again some common stuff */ 
} 
+1

Не лучше ли перегружать, чем специализироваться? – Flexo

+0

Флексо справа. Зачем специализироваться? Это намного яснее, если вы просто предоставляете перегрузку 'int'. – mfontanini

+0

Абсолютно верно. – Gigi