如何获取指向专门针对字符串的模板函数的指针?

Posted

技术标签:

【中文标题】如何获取指向专门针对字符串的模板函数的指针?【英文标题】:How to take a pointer to a template function specialized on a string? 【发布时间】:2009-06-26 20:06:12 【问题描述】:

我尝试使用一组过滤器函数来根据字符串输入运行适当的例程。我尝试使用模板为常见情况创建匹配器函数,但是当我尝试存储指向专用函数的指针时出现“类型不等于类型”错误(在结构中,在实际应用程序中)

从 Visual C++ 8“控制台应用程序”中提取的示例

template <const char *C>
const char*
f(void) 
  return C;


const char* (*g)(void) = f<"hi">;


int _tmain(int argc, _TCHAR* argv[])

  return g();

这会失败并出现错误

Error   1   error C2440: 'initializing' : cannot convert from 'const char *(__cdecl *)(void)' to 'const char *(__cdecl *)(void)'    c:\files\pointer.cpp    7   

(它在主返回值上也有错误,但这与我无关。)

如果将const char * 替换为int,则相同的示例会成功。

【问题讨论】:

你知道你可以通过 char gs[] = "hi"; 编译它吗? const char* (*g)(void) = f; 确实找到了使用命名变量的参考,但这会破坏我想要的简洁表;最好将字符串添加到表中并将其传递给函数。实际上,我只是下注并使用了 if/else 链。 【参考方案1】:

ISO 标准禁止将字符串作为模板值参数。

【讨论】:

附加信息:模板值参数必须是内置整数类型。 @Mr. Bond:但指针是整数类型。字符串文字的问题在于,驻留在不同编译单元中的两个等效字符串可能具有不同的地址,从而创建了两个不同的模板实例化。 指针是标量类型,但它们不是整数类型。它们只是允许的另一种形式的参数。引用也可以作为模板参数和成员指针。 他们不是。如果你声明一个带有外部链接的数组,你可以将它传递给那个模板。

以上是关于如何获取指向专门针对字符串的模板函数的指针?的主要内容,如果未能解决你的问题,请参考以下文章

如何定义和设置指向模板类方法的函数指针

typedef 模板,接受指向 const 和非 const 函数的指针

指向模板类成员函数的函数指针

模板函数将参数函数指针指向类方法

函数模板与模板函数

模板化函数或带有指向基类的指针的函数