我有一个带有三个构造函数的类模板,其中一个是函数模板。
template<class T>
class TemplateOverLoading
{
public:
TemplateOverLoading(void){};
~TemplateOverLoading(void){};
//constructor that take reference
TemplateOverLoading(std::string& qName, T& qValue )
: mName(qName),
mValue( &qValue)
{
std::cout << "Reference -> "<< *mValue <<"\n";
}
//Template constructor that takes array
template<class T, int N>
TemplateOverLoading(std::string& qName, T (&t)[N])
: mName(qName),
mValue(t)
{
std::cout << "Array ->\n";
for(int i = 0; i < N; i++)
std::cout<< mValue[i];
std::cout << std::endl;
}
//Other constructor that take pointer
TemplateOverLoading(std::string& qName, T* qValue )
: mName(qName),
mValue( qValue)
{
std::cout << "Pointer "<< *mValue <<"\n";
}
private:
T* mValue;
//T* mValueArray;
std::string& mName;
};
从我的应用程序中,我需要区分引用类型/值、指针和数组并执行特定操作。因此,我决定必须使用不同的构造函数。
我正在尝试以下列方式调用构造函数:
int init(10);
int intArray[10] = {0,1,2,3,4,5,6,7,8,9};
TemplateOverLoading<int> mInt(std::string("mInt"), init);
TemplateOverLoading<int> mIntArray( std::string("mIntArray"), intArray );
问题是如果定义了带有指针的构造函数,则永远不会调用数组构造函数。但是,如果我将其注释掉,它会按应有的方式打印数组。
输出:
(when pointer constructor is present)
Reference -> 10
Pointer 0
(when pointer constructor is not present)
Reference -> 10
Array ->
0123456789
所以在语法上它是可能的,并且推断数组大小 N 是正确的。
显然,当存在数组构造函数时,我会混淆编译器。因此,我没有让编译器自动推断,而是尝试为数组构造函数指定模板参数,只发现与常规函数不同,模板参数不能具体指定。
我想在数组构造函数中引入一个虚拟参数来区分重载,但这似乎不太好。
有没有其他方法可以解决这个问题?任何线索表示赞赏。