我有一个函数接受任何类型的变量。现在,如果变量为char*
或const char*
,我需要知道长度。怎么做?
下面的函数没有编译。 subscript requires array or pointer type
template <typename Type>
unsigned long get_len(Type in)
{
unsigned long i = 0;
while (in[i]) ++i;
return i;
}
答案 0 :(得分:1)
定义模板化函数时,可以使用非模板化函数重载它。因此,对于需要以不同方式处理char *的函数,请将其重载。
例如:
void AnyTypeFunction(char* type);
和
template<typename Type> void AnyTypeFunction(Type type);
答案 1 :(得分:0)
错误本身很容易解决,只需Type*
上的模板,这意味着ptr可以是这样的任何类型:
unsigned long get_len(Type* in)
但是,稍后您将遇到更糟糕的问题,看看这将如何在非空终止的字符串中严重失败。 (+它将接受任何数组,通常不会以空终止等等。)
实际上,正确约束模板类型是相对高级的主题,并且根据评论判断,您想要做的并不是一个好主意。
答案 2 :(得分:0)
模板实例化时会发生编译失败。
可能这个函数可能是从其他模板代码中调用的,例如:
template <typename Type>
void f(Type in)
{
unsigned l = get_len(in);
// etc.
}
char* s= "hi";
f(s); // Compiles OK.
int i = 0;
f(i); // Compile failure.
因此,当get_len
不是数组类型时,Type
没有任何意义,您不应该从模板的其他实例化中调用它。
如其他地方所述,解决方案是基本模板不要调用get_len
。
然后,您可以创建模板特化或仅处理char*
案例的普通重载,并调用get_len(char*)
,然后不需要成为模板。