c++模板接口的使用
C++ templates interfaces using
我发现模板接口非常优雅,尝试实现它面临着我无法解决的问题。我希望你能给我一些启示。
我有一个类,例如forge.h:
template<typename T> class Smelter;
template <typename T>
class Forge
{
long SmeltIt(vector<T>& ore)
{
long res;
Smelter<T> smelter;
for (const auto t : ore)
{
res += smelter.smelt(t);
}
return res;
}
};
模板类Smelter没有实现,模板类Forge有实现。
现在,当我想添加类Iron时,我需要创建Iron .h并实现Smelter来使用它,这样 Iron .h:
#include "forge.h"
class Iron {};
template<>
class Smelter<Iron>
{
long smelt(const Iron& iron) { return 5; }
};
int main()
{
vector<Iron> ore;
Iron iron;
ore.push_back(iron);
ore.push_back(iron);
ore.push_back(iron);
Forge<Iron> forge;
cout << forge.SmeltIt(ore); //have to be 15
}
如果所有这些东西都在一个头文件中,一切都完美工作。但是,如果我创建iron.h,我试图实现冶炼厂,编译器找不到模板类冶炼厂。如果我在forge.h和iron.h中都创建了冶炼厂声明的副本,那么它们就会相互冲突。
最好的解决方案是什么?这将是非常有用的,如果我将能够实现我的模板接口在其他文件。如果没有这个,这样的模板接口就会变得丑陋,例如,如果forge.h是工具,在项目之间使用,而iron.h是我当前的专门化。
结果:一切正常,问题不在描述的问题范围内,在名称空间内。所有的模板,即使可以在不同的文件之间分离它们(这是一个问题)-完美的工作。但是它们必须共享相同的命名空间
修复了一些小问题后,您的代码可以很好地编译(使用clang 3.3)并产生所需的结果。下面是固定的代码(在一个文件中,但是按照#include的顺序)
template<typename T> class Smelter;
template <typename T>
class Forge
{
public:
long SmeltIt(std::vector<T>& ore) // must be public; use std::
{
long res{}; // must be initialized (to 0)
Smelter<T> smelter;
for (const auto t : ore)
res += smelter.smelt(t);
return res;
}
};
class Iron {};
template<>
class Smelter<Iron>
{
public:
long smelt(const Iron& iron) // must be public
{ return 5; }
};
int main()
{
std::vector<Iron> ore; // std::
Iron iron;
ore.push_back(iron);
ore.push_back(iron);
ore.push_back(iron);
Forge<Iron> forge;
std::cout << forge.SmeltIt(ore) // have to be 15
<< std::endl;
}
相关文章:
- C++核心准则 C35 对于接口类"A base class destructor should be either public and virtual, or protected and nonv
- Visual C++GC接口如何启用它以及要包含哪个库
- Windows.h与GLFW.h的接口
- 当字段可以为null时,如何使用C++接口在Avro中写入数据
- 提供与TMP和SFINAE的通用接口
- 为重写std::exception的库生成swig接口时出错
- 内联如何影响模块接口中的成员函数
- COM 接口 c# 封送数组数组
- 如何在 SCIP C++ 接口中获取 MILP 约束矩阵中的系数值
- 重载 -> shared_ptr 个实例中的箭头运算符<interface>,接口中没有纯虚拟析构函数
- 如何绑定 C++ gRPC 客户端的网络接口
- 模板化接口 - 创建一个泛型模板类以返回任何容器
- 如何从实现接口的模板化类实例访问结构
- 带有进度表的 curl 多接口程序
- 设计帮助 - 为不同类型的消息处理通用接口的设计模式
- 我可以在具有一个标头和一个接口的 cpp 文件中有多个嵌入吗?
- 类接口,可以创建N个方法
- 类具有相同的接口,但参数的类型不同
- 如何与 Cheerp/js 中的 extern 变量接口?
- 如何使用现代 CMake 安装捆绑的接口依赖项?