2009-05-26 3 views
0

Эй, я пытаюсь выяснить, возможно ли «перегрузить» деление класса шаблона с помощью параметров выражения. Вид вроде следующего фрагмента кода.Перегрузка параметра выражения класса шаблона

template<class T> 
class Test 
{ 
public: 
    T testvar; 

    Test() 
    { 
     testvar = 5; 
     cout << "Testvar: " << testvar << endl; 
    } 
}; 

template<class T> 
class Test<T, int num> 
{ 
public: 
    T testvar; 

    Test() 
    { 
     testvar = 10; 

     cout << "Testvar: " << testvar << endl; 
     cout << "Param: " << num << endl; 
    } 
}; 

Спасибо.

Edit: Для записи, я пытаюсь сделать это с помощью C++, если это не было очевидно ... :)

ответ

2

Шаблоны позволяют параметры шаблона по умолчанию, которые могут дать что-то подобное тому, что вы ищу ..

template<class T, int num = -1> 
class Test 
{ 
public: 
    T testvar; 

    Test() 
    { 
     testvar = (num == -1 ? 10 : 5); 

     cout << "Testvar: " << testvar << endl; 
     if (num != -1) 
      cout << "Param: " << num << endl; 
    } 
}; 
+0

Спасибо, это было то, что я искал. – Morgan

1

Если вы хотите, чтобы иметь возможность указать только один аргумент шаблона для Test, вам нужно будет объявить параметр шаблона по умолчанию в качестве Shmoopty suggests.

Это также можно частично специализировать для различных значений параметров:

// This base template will be used whenever the second parameter is 
// supplied and is not -1. 
template<class T, int num = -1> 
class Test 
{ 
public: 
    T testvar; 

    Test() 
    { 
     testvar = 10; 
     cout << "Testvar: " << testvar << endl; 
     cout << "Param: " << num << endl; 
    } 
}; 

// This partial specialisation will be chosen 
// when the second parameter is omitted (or is supplied as -1). 
template<class T, int num> 
class Test<T, -1> 
{ 
public: 
    T testvar; 

    Test() 
    { 
     testvar = 5; 
     cout << "Testvar: " << testvar << endl; 
    } 
}; 

Это исключает необходимость if или switch заявления, что делает его немного быстрее (без тестирования во время выполнения не выполняется) и позволяет дополнительные случаи быть «привиты» позже в виде дополнительных частичных специализаций. (Хотя какой подход более ясен, это вопрос личного вкуса.)

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

  • Нет связанных вопросов^_^