2010-11-11 48 views
1

假设我有一个需要3个模板参数的模板。 我想要第三个模板参数由另一个模板采取说“检查”,可能会返回任何整数的情况下,因为检查失败,否则“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

IIUC,你想阻止用户提供第三个参数。

重命名类XX_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 > {}; 
+0

模板 :: IS_TRUE>未在C++允许? {see difference int = CHECK :: IS_TRUE}。也可以解耦实现,然后用户可以直接使用我不想要的实现。模板类可以嵌套模板类吗? – 2010-11-11 21:30:08

+0

模板类可以嵌套模板类吗? – 2010-11-11 21:34:58

+0

@Sudhendu:是的,这是(它没有必要),是的,它可以。但我想我真的不明白你的问题。从你问题的答案来看,我可能并不是唯一的答案。 – sbi 2010-11-11 21:36:06