将 void 函数模板专门化为 const char[N]

2024-03-24

我有一个我想要专门化的模板化函数foo to const char[N](硬编码字符串)

    template<typename T>
const std::string foo() ;

    template<typename T,int N>
const std::string foo<T[N]>() { return "T[N]"; } //this doesn't work for const char[12]

    template<>
const std::string foo<const char*>() { return "Const char"; } //this doesn't work for const char[12]

   template<typename T>
   void someother function(T obj)
   {

   string s = foo<T>(); //I want to overload when T is const chat[N]
   }

   function("Hello World");  //When calling like this the type is const char[12]

我以为我可以做一些像已经完成的事情Here http://www.dev102.com/2009/01/12/c-tip-how-to-get-array-length/.
但它效果不佳,因为我没有传递参数,只是传递模板类型。
我可以这样做,但没有理由将参数传递给该函数。

该示例不起作用,因为我没有传递变量。尝试了一些事情,但无法让它发挥作用。

这是我唯一无法解决的专业。我专门为 int、string 和其他类型设计了该函数,它们工作正常。

 error LNK2001: unresolved external symbol "class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const __cdecl foo<char const [12]>(void)" 

第一个模板化声明没有任何有意的代码...我正在尝试获得将用于我的案例的正确专业化。


你必须分两步完成。由于不能部分特化函数,因此必须让函数调用可以部分特化的类。所以下面的方法会起作用。

#include <typeinfo>
#include <iostream>

namespace detail {

  template <typename T> struct foo_helper {
    static std::string helper() {
      return typeid(T).name();
    }
  };

  template <int N> struct foo_helper<const char [N]> {
    static std::string helper() {
      return "Const Char Array";
    }
  };
}

template <typename T> std::string foo(T& obj) {
  return detail::foo_helper<T>::helper();
}

int main() {
  std::string x;
  const char c[] = "hard coded";
  std::cout << foo(x) << std::endl;
  std::cout << foo(c) << std::endl;
}

这正确地调用了常量字符串的特化。我也改变了T obj into T& obj,因此 g++ 会将静态字符串作为数组而不是指针传递。有关部分专业化的更多详细信息,请参阅http://www.gotw.ca/publications/mill17.htm http://www.gotw.ca/publications/mill17.htm

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 void 函数模板专门化为 const char[N] 的相关文章

随机推荐

  • 为什么允许空对象上的扩展方法?

    允许在空对象上调用扩展方法有什么意义 这使我不必要地检查扩展方法中的空对象 AFAIK 我无法理解这一点 请解释 扩展方法是 C 语言的语法糖 它们被编译为 ILCode 中的普通静态方法调用 静态方法在编译时不知道任何有关参数的信息
  • 在 R 中,如何在点 sf 对象上运行 st_convex_hull 函数?

    我正在尝试在 R 中获得点特征的凸包 library tmap library sf nc lt st centroid st read system file shape nc shp package sf qtm nc ch lt st
  • 前台服务被操作系统杀死

    我有一个前台服务 它从服务器下载一些数据 问题是有时操作系统杀死了我的前台服务 但服务的通知不会被删除 关于如何在服务不再存在时删除通知的任何想法 None
  • 棘手的 Django GenericRelation 查询

    假设我有一些代表现实生活中的对象的模型 Person Chair Room 我也有一个 收藏 模型 它代表这些模型的一些记录的集合 每个模型都可以是多个集合中的成员 因此 我还创建了一个 会员资格 model 表示一个对象是集合的成员 它的
  • Firestore 文档参考数组

    我的 Firestore 数据库具有以下结构 products Collection procuct 1 Document title url videos Collection video 1 Document title product
  • 如何在 mac osx 上安装 Python docx 模块

    我正在尝试生成 docx使用 Python 的文件 我搜索了网络和帖子 发现了一个模块 https github com mikemaccana python docx blob master README markdown https g
  • 当 Android 的 PreferenceActivity 的 isValidFragment() 被调用时?

    对于我正在开发的某些应用程序 对于 API 级别 19 的设备 我遇到了异常 Caused by java lang RuntimeException Subclasses of PreferenceActivity must overri
  • 当属性是对象时命名查询?

    我想在 JPA 中进行此查询 SELECT FROM happyDB users U WHERE U party as user 1 AND U party party id 2 这工作正常 但我的问题是我有Party只能作为一个对象 而不
  • 由 Android 应用程序和网站共享的关系数据库 - 最简单的方法

    我有一个项目 我将开发一个 Android 应用程序和一个网站 他们都应该共享相同的数据库 我正在尝试探索所有选项 但我真的很困惑 这是我的要求 1 我需要一个非常简单且EASY方式 我并不是想学习 我只是想学习 我只是想把事情做好 2 数
  • microk8s 连接到端口 16443 被拒绝

    我收到以下错误消息 root master 1 microk8s kubectl get no The connection to the server 127 0 0 1 16443 was refused did you specify
  • 使用 Storyboard 与编程方式进行 iOS 开发的速度?

    作为初级 iOS 开发人员 哪种方法可以实现更快 更高效的开发 这个问题没有正确的答案 对于使用 Xcode 进行开发 2 3 年的人来说 旧的编程方式更高效 而且故事板感觉很陌生 这就是我个人的处境 对于今天刚刚开始使用 Xcode 或
  • 如何向 NSDate 添加 1 天?

    基本上就如标题所说 我想知道如何添加 1 天NSDate 所以如果是 21st February 2011 它将变成 22nd February 2011 或者如果是 31st December 2011 它将变成 1st January
  • Powershell:作为本地系统运行时向登录用户发送 toast 通知

    我有一个作为本地系统运行的脚本 它执行一些操作 包括检查用户是否已登录 如果是 它会运行 PowerShell 代码片段来显示 toast 通知 如下所示 如果 PS 以当前用户身份运行 则可以正常工作 如果它作为 LocalSystem
  • Python对一个列表从另一个列表进行排序[重复]

    这个问题在这里已经有答案了 我已经在这个程序上工作了一段时间 但不知道如何从第二个列表中的内容对我的一个列表进行排序 对于这个程序 我有一个单词列表 还有一个单词在我打开的文件中出现的次数的列表 我需要根据单词出现的频率降序对单词列表进行排
  • NSFontAttributeName 与 NSAttributedStringKey.font

    我在使用我已经使用了一段时间的库中的 Swift 代码时遇到了一些问题 这似乎与某种版本冲突有关 但我不确定 这是代码 let attribMsg NSAttributedString string msg attributes NSAtt
  • ggplot 中的欧洲/法国千位分隔符

    我正在尝试格式化 ggplot 图中的 y 轴 并使用空格 而不是逗号 作为千位分隔符 大约是 10 000 而不是 10 000 我在 中找不到它scale y continuous help 感谢您的任何提示 正如 David 和 jo
  • Xcode 4 调试

    自从迁移到 Xcode 4 以来 我对调试视图完全感到困惑 因为我无法看到数组 字典等的值 在 Xcode 3 下我可以查看调试控制台并查看存储的实际值 调试信息现在出现在调试导航器 http developer apple com lib
  • 在 Visual Studio 中删除折叠区域和摘要周围的框

    我正在使用 VS2010 我想在压缩区域和 或摘要时更改它们的字体样式 主要是为了删除这些部分周围的边框 因为在滚动代码时它会变得分散注意力 我浏览了 字体和颜色 和其他选项 但找不到任何明显可以让我更改它的内容 这个字体可以自定义吗 如果
  • 如何在不使用 strlen() 的情况下查找 php 中的字符串长度?

    如何在不使用 php 的情况下找到字符串的长度strlen 我知道这是一个很老的问题 但这段代码对我有用 s string i 0 while s i i print i
  • 将 void 函数模板专门化为 const char[N]

    我有一个我想要专门化的模板化函数foo to const char N 硬编码字符串 template