C++中的模板/引用
Templates in C++ / reference
现在是凌晨3:30,我正在做一个关于C++中模板的练习。我不明白在这种情况下我做错了什么,你能帮我理解吗?(我不太擅长C++,2周前开始)。
主题是:
[…],必须对函数进行编码模板foreach。此函数允许通过为这个数组的每个元素调用一个函数。函数接受数组开头的地址作为自变量函数和数组大小的引用。上的引用函数对应于以下原型:void func(const-type&elem);此外,您必须提供传递给函数foreach和显示每行一个元素,不管他们是什么类型。
这是我的代码:
ex03.hpp
#ifndef __EX03_H_INCLUDED__
# define __EX03_H_INCLUDED__
#include <iostream>
#include <iomanip>
template<typename type>
void foreach(type tab[0], (*)(print(const type& elem)), type size)
{
int i;
for (i = 0; i != size; i++)
print(tab[i]);
}
template<typename type>
void print(const type& elem)
{
std::cout << elem << std::endl;
}
#endif /* !__EX03_H__ */
和:
main.cpp
#include "ex03.hpp"
int main(void)
{
int tab[] = { 11, 3, 89, 42 };
foreach(tab, print<int>, 4);
std::string tab2[] = { "j’", "aime", "les", "templates", "!" };
foreach(tab2, print, 5);
return 0;
}
我只允许交ex03.hpp,这只是一个测试主线。我想知道我做错了什么。谢谢
问题出在foreach模板化函数中:
- 第一个参数可以是指向数组的指针,也可以只是大小未定义的静态数组
- 第二个参数可以是函数指针或对函数的引用(它应该通过引用接受与数组元素类型相同的常量元素,因为它不会被修改)
- 第三个参数应该是不同的类型,因为数组大小不一定与数组元素类型相同
修复的ex03.hpp看起来像这样:
#ifndef __EX03_H_INCLUDED__
#define __EX03_H_INCLUDED__
#include <iostream>
// option 1
template<typename T1, typename T2>
void foreach(T1* arr, void (*fnc)(const T1&), T2 size) {
for (T2 i = 0; i < size; i++) {
(*fnc)(arr[i]);
}
}
// option 2
template<typename T1, typename T2>
void foreach(T1 arr[], void (&fnc)(const T1&), T2 size) {
for (T2 i = 0; i < size; i++) {
(*fnc)(arr[i]);
}
}
template<typename T1>
void print(const T1& element) {
std::cout << element << std::endl;
}
#endif /* !__EX03_H__ */
和主.cpp:
#include "ex03.hpp"
#include <string>
int main() {
const size_t tab1Size = 4;
int tab1[tab1Size] = { 11, 3, 89, 42 };
foreach(tab1, print, tab1Size);
const size_t tab2Size = 5;
std::string tab2[tab2Size] = { "j’", "aime", "les", "templates", "!" };
foreach(tab2, print, tab2Size);
return 0;
}
但我同意前面其他人说的,你应该首先学习c++的基础知识,这样更容易理解更复杂的东西。
相关文章:
- 将对象数组的引用传递给函数
- 什么时候在C++中返回常量引用是个好主意
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 何时在引用或唯一指针上使用移动语义
- 如何在c++中使用引用实现类似python的行为
- 编译C++时未定义的引用
- Ctypes wstring通过引用传递
- c++r值引用应用于函数指针
- 理解c++中的引用
- C++取消引用指针.为什么会发生变化
- 如何修复此错误:未定义对"距离(浮点数,浮点数,浮点数,浮点数,浮点数)"的引用
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- 强制转换为引用类型
- 引用一个已擦除类型(void*)的指针
- 向量元素的引用地址与它所指向的向量元素的地址不同.为什么
- 具有默认值的引用获取函数
- 如何使用基类指针引用派生类成员
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- 如何引用基类的派生类?