2013-04-23 3 views
2

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

упрощенный пример того, что я хотел бы получить компиляции:

template <int A, int B, int C> 
struct S 
{ 
    void fun() {} 
}; 

template <int A, int B> 
struct S<A,B,0> 
{ 
    void fun1() {} 
}; 

template <int A> 
struct S<A,0,0> 
{ 
    void fun2() {} 
}; 

int main() 
{ 
    S<0,0,0> s; 
    s.fun(); 
    s.fun1(); 
    s.fun2(); 
    return 0; 
} 

Мне нужно найти решение с C++ 03 компилятором.

ответ

5

Как это, ваша специализация не является специализация, так как он не специализироваться какой-либо из аргументов первичного шаблона:

template<int A, int B> 
struct S<A,B> // ... 
//  ^^^ 
//  Does not really specialize the primary template, 
//  no specialized pattern is introduced here 

Вы могли бы попытаться переписать его так:

template<int A> // <== Only the first template parameter of the primary 
       //  template is unconstrained in the pattern we want to 
       //  express (the second template argument shall be 1) 
struct S<A,1> : public S<A,0> 
//  ^^^    ^
// Specializes!   Something meaningful should go here, 
//       but that actually depends on the real 
//       class templates you are using and their 
//       semantics 
{ 
     void fun1() {} 
}; 

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

#include <type_traits> // <== Required for std::enable_if<> 

template <class T = void> 
//     ^^^^ 
//     The function's return type here 
typename std::enable_if<B == 1, T>::type 
//      ^^^^^^ 
//      Your condition for the function's existence 
fun1() 
{ 
    // ... 
} 

Это live example, демонстрирующий эту технику.

+0

Значение по умолчанию для параметра шаблона предоставляет специализацию? –

+0

@ Koushik: В зависимости от того, что вы имеете в виду. В основном шаблоне вы можете указать 'int B = 1', а затем' S 'будет соответствовать' S 'специализации (с' A = X'), если это то, что вы спрашиваете –

+0

да, это то, что я спросил. из-за отсутствия лучшего предложения. –

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