2013-10-07 79 views
0

我想通过不允许隐式类型转换(如string-> bool从而引发编译错误)来实现模板类参数的类型检查。 具体情况如下简单:类型检查模板类参数

#include <iostream> 
#include <string> 
using namespace std; 

template <class T> 
class myPair { 
T a, b; 
public: 
    myPair(T first, T second) { 
    a = first; 
    b = second; 
    } 
    void test(); 
}; 

typedef myPair<bool> boolParm; 

template<class T> 
void myPair<T>::test() { 
    if(a == true) { 
    cout << "a is true" << endl; 
    } else { 
    cout << "a is false" << endl; 
    } 
    if(b == true) { 
    cout << "b is true" << endl; 
    } else { 
    cout << "b is false" << endl; 
    } 
} 

int main() { 
    boolParm myObj(false, "false"); 
    myObj.test(); 
    return 0; 
} 

上述场景的输出是不期望的,因为用户可能会在无意中通过2种不同类型:布尔和字符串和接收的第一个为假(正确的,因为通过作为布尔),但第二个将是真实的(不正确,因为从字符串隐式类型转换为布尔)。 我希望限制main()中的用户代码抛出编译错误,并禁止在构造函数中传递字符串/整型参数。它应该只允许bool。 我尝试通过使用重载的构造函数myPair(布尔第一,字符串第二),但它不匹配,因为我猜字符串的默认类型转换发生在调用构造函数之前。 在这种情况下是否有使用模板专业化的解决方案? 高度赞赏任何帮助 谢谢

回答

1

一个解决方法是添加一个模板工厂函数来创建myPair。

template <typename T> 
myPair<T> makeParam(T a, T b) { 
    return myPair<T>(a, b); 
} 

如果类型不匹配,将无法使用模糊参数T进行编译。

int main() { 
    boolParm myObj = makeParam(false, "false"); 
    myObj.test(); 
    return 0; 
} 

交替改变的构造函数:你可以用模板专门明确禁止某些类型T.你的主要功能则看起来像扩展这个

template <typename U, typename V> 
myPair(U a, V b); 

,专门为需要

这种专业化的一个例子:

template <class T> 
class myPair { 
    T a, b; 
public: 
    template <typename U, typename V> // generic version 
    myPair(U first, V second) 
    { 
     // intentionally fail to compile 
     static_assert(false, "don't support generic types"); 
    } 

    template <> // template specialization 
    myPair(T first, T second) 
    { 
     // explicitly require exactly type T 
     a = first; 
     b = second; 
    } 
}; 
+0

啊因为这里它是模板分辨率失败而不是参数转换!巧妙! – codeling

+0

感谢您的意见...我的问题是main()中的部分是用户代码,我不能要求用户更改他们的代码或支持上面格式的已经写好的用户代码..我只能修改基类即myPair来实现这个功能。 –

+0

@gigaplex:您可以在第二个选项中提到关于如何在此场景中使用专业化的更多细节! –