Есть ли что-то вроде обязательного аргумента шаблона, которое выводится из другого аргумента шаблона? - PullRequest
1 голос
/ 12 ноября 2010

Предположим, у меня есть шаблон, который принимает 3 параметра шаблона.Я хочу, чтобы третий параметр шаблона был взят другим шаблоном, скажем «CHECK», который может вернуть любое целое число в случае сбоя CHECK, иначе «1».В случае «1» класс X является специализированным.Как показано в следующем коде.Как я могу этого добиться, то есть как заставить всегда использовать аргумент шаблона по умолчанию (цель состоит в том, чтобы сделать его обязательным, а не по умолчанию).Вкратце: «Я хочу запретить пользователям вводить третий параметр».

   template<typename T, typename D , int = CHECK<T, D>::IS_TRUE >
class X
{
    public :
    X()
    {
        using namespace std;
        cout << "Inside General Implementation " << endl;
    }
};
template<typename T, typename D>
class X<T, D, 1>
{
    public :
    X()
    {
        using namespace std;
        cout << "Inside SPECIAL Implementation " << endl;
    }
    //Specialized Implementaion
};
int main(int argc, char* argv[]) try
{
    X<MyWiget, YourWiget > xObj ; //CHECK  used desired behaviour
    X<MyWiget, YourWiget, 1 > xObj ; //CHECK not used specialized behaviour 
    X<MyWiget, YourWiget, 2 > xObj ; //CHECK not used i.e. default template argument not used
}
catch(...)
{
    //should not land here
    using namespace std;
    cout << " Problems in exception handling in  code";
}

1 Ответ

1 голос
/ 12 ноября 2010

IIUC, вы хотите запретить пользователям вводить третий параметр.

Переименуйте свой класс X в X_impl и укажите новый X с меньшими параметрами:

template<typename T, typename D, int Int >
class X_impl;


template<typename T, typename D >
class X : public X_impl< T, D, CHECK<T, D>::IS_TRUE > {};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...