是否存在从其他模板参数推断出的强制模板参数?

时间:2010-11-11 21:10:32

标签: c++ templates

假设我有一个模板,它带有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 个答案:

答案 0 :(得分:1)

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 > {};