模板strnlen一塌糊涂

时间:2014-02-06 23:23:28

标签: c++

我有一个函数接受任何类型的变量。现在,如果变量为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;
}

3 个答案:

答案 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*),然后不需要成为模板。