Перегрузка параметра выражения класса шаблона - PullRequest
0 голосов
/ 26 мая 2009

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

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 ]

2 голосов
/ 26 мая 2009

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

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;
    }
};
1 голос
/ 26 мая 2009

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

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

// 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, что делает его незначительно более быстрым (тестирование во время выполнения не выполняется) и позволяет "прививать" дополнительные случаи позже в виде дополнительных частичных специализаций. (Хотя какой подход яснее, это вопрос личного вкуса.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...