- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我真的很希望能够有一个免费的函数来适应它被给定的任何类型。
例如
template <typename T> bool ReadLine(T & reader, std::string & line)
{
return reader.ReadString(line);
}
对于某些 T,正确的函数是 reader.ReadString(buffer)。但对于其他人来说,它应该是 reader.ReadLine(buffer)。当然, future 可能还会有其他模式。重点是调整自由函数 ReadLine(from, into) 以使用任何合理的 from & into 集(我强制目标缓冲区为 std::string 以简化这里的事情)。
现在,我可以为我想要的任何具体类型制作一个非模板版本的 ReadLine,但我真正需要的是能够部分专门化类型的类,例如那些支持模式 reader.ReadString()所有最终都使用它,那些支持 reader.ReadLine() 的使用它,将来我可以添加其他模式而不会干扰任何已经工作的东西。
我知道我可以创建一个策略类,例如 LineReaderPolicy,它知道对于给定的 T 要使用哪种模式(它必须根据 T 进行部分特化才能将其映射到正确的模式。
但是否有更好、更符合 C++14 的方法来解决这个问题?
这是其中之一“上帝啊,模板似乎真的非常非常接近真正非常有用……但是对于这个不断重复出现的问题……”
C++11/14 的可堆肥性比以往任何时候都好,但这个基本问题似乎仍未解决?或者是?!
你会如何建议我编写一组自由函数来适应任何合理的 T 以从中读取一行? T 是否是字符串流、输出迭代器、文件句柄、字符串、字符串 View 等...
在我能写出一个合理的程序之前,我不能认为 C++ 真的成熟了
template <typename T> size_t length(T t) { return t.size(); }
然后我可以将其扩展到任何合理的 T,而不必编写了解 T 如此多细节的代码,而是可以通过这种灵活的自由函数适配器与大量 T 进行互操作...
最佳答案
如果您可以确保最多定义了 reader.ReadString
或 reader.ReadLine
之一,请使用 SFINAE 控制重载 ( Live at Coliru ):
template <typename T>
auto ReadLine(T& reader, std::string& line) -> decltype(reader.ReadString(line)) {
return reader.ReadString(line);
}
template <typename T>
auto ReadLine(T& reader, std::string& line) -> decltype(reader.ReadLine(line)) {
return reader.ReadLine(line);
}
不适用的实现将触发 SFINAE 并从重载集中删除,只留下正确的实现。
在 C++14 中,您将能够省略尾随返回类型并简单地使用返回类型推导。
在 C++ 的 future 修订版中,Concepts Lite将使这可以更干净地完成。给定区分两种不同类型阅读器的概念 - 例如 StringReader
和 LineReader
:
template <typename T>
concept bool StringReader() {
return requires(T& reader, std::string& line) {
{reader.ReadString(line)} -> bool;
};
}
template <typename T>
concept bool LineReader() {
return requires(T& reader, std::string& line) {
{reader.ReadLine(line)} -> bool;
};
}
您将能够直接将您的实现限制为对这些概念建模的类型集:
bool ReadLine(StringReader& reader, std::string& line) {
return reader.ReadString(line);
}
bool ReadLine(LineReader& reader, std::string& line) {
return reader.ReadLine(line);
}
希望您能够在其他地方重用这些概念,以证明“new-special-better”语法比旧的讨厌语法长得多。 Concepts Lite 还可以通过显式消除歧义来处理对两个 概念建模的类型:
template <typename T>
requires StringReader<T>() && LineReader<T>()
bool ReadLine(T& reader, std::string& line) {
// Call one, or the other, or do something completely different.
}
关于c++ - 用于自由函数包装器的 SFINAE 技术,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22409356/
这是我正在调试的函数: boolean adin_memory(char* buffer, int size_chunck, int end_flag){ global_buffer = my
我正在尝试为具有自由 float 底座的机器人计算末端执行器空间速度雅可比行列式。由于自由 float 基数,雅可比应该包含一个基数组件和一个操纵器注释(参见 https://spart.readth
procedure FreeListObjects( l : TStrings); var i : integer; BEGIN FOR i := 0 TO l.Count -1 DO BEG
我正在探索 Haskell 中的选项,这些选项可以让我将业务逻辑与底层系统的技术实现分开。例如,在 Web 服务器的上下文中,将 Web 服务器处理其接收的信息的方式与其读取和写入数据库的方式分开。要
我的目标是使用来自 ActiveMQ 的 WebSphere Liberty Appserver(完整的 Java EE 标准)使用消息。不幸的是,我不知道如何配置 WebSphere Liberty
我以这种方式分配了一个非方阵,但我不确定我是否正确使用了释放 float **matrix_alloc(int m /* rows */, int n /* columns */) { int
我在阅读 refuting the notion 之后的第 13.5 节内置运算符不参与重载决议,并注意到没有关于 operator->* 的部分。它只是一个通用的二元运算符。 它的兄弟operato
我正在尝试使用 Libelf 库来获取有关某些 elf 文件的一些信息。但我不断收到这些“对 [...] 的 undefined reference ”。我从 synaptic 安装了 libelf(
我有创建动态结构数组的波纹管代码。 #include #include #include typedef struct { int flag; char* ip; } ip_mo
我是 StackOverflow 的新人。我现在正在学习C指针。 这是我的代码: #include #include int alloc(int* p){ p = (int*) mallo
我是 StackOverflow 的新人。我现在正在学习C指针。 这是我的代码: #include #include int alloc(int* p){ p = (int*) mallo
我正在用 C 编写一个程序,我需要读入一个文件并打印出每个至少 4 个字符长的字符串。我在分配要使用的内存时遇到问题。字符串可以任意长。我试图将缓冲区分配给文件的大小,然后在最后释放它,但我显然错过了
我尝试用 C 语言编写 ls 命令,但 -R 选项有问题。 输出: /Applications/Atom.app/Contents/Resources/app/apm/node_modules/es5
我正在编写一个 shell,但在执行内存检查时遇到问题,因为 valgrind 无法正常运行。 我遇到了这样的错误(我自己杀死了它): ==19703== Memcheck, a memory err
我有这样一段代码: void *write_parallel(void *num_for_chunk) { struct rusage *sum = (struct rusage*) mall
当使用包含 200-300 个整数(以空格分隔)的输入 .txt 文件运行此代码时,我在使用 fprintf 语句的 for 循环之前收到错误。 我不确定 qsort 是否导致了此错误或为什么会发生此
我试图告诉 Websphere Liberty 我的 log4j2.xml 文件在哪里,但它不起作用。 在我的文件 jvm.options 中,我配置: -Dlog4j.configurationFi
从 websphere liberty 16 迁移到 19.0.0.1 我遇到以下异常:运行存储过程后关闭连接,出现以下异常: EJB threw an unexpected (non-declare
当对大小为 210*8 的种子数据集运行此代码时,我在预测函数中的 qsort() 行之后收到错误。它不在 qsort() 之后执行。 我不确定 qsort 是否导致了此错误或为什么会发生此错误,但如
这个问题已经有答案了: Facing an error "*** glibc detected *** free(): invalid next size (fast)" (2 个回答) 已关闭 9
我是一名优秀的程序员,十分优秀!