使用完全专用的别名进行实现切换
Implementation switching with fully-specialized aliases
我正在为一个使用makefile规则在GPU和CPU实现之间切换的项目编写。我想为用户代码提供一个接口,它可以在实现之间自动切换,而不必到处写#ifdef GPU_MODE。
我的解决方案是使用一个模板化的接口类,然后是别名模板(实际上只是类型定义,但我喜欢从左到右的样式),如下所示:
namespace INTERFACE{
template <class VERSION>
class MyClass{
public:
MyClass():theClass(){};
//more methods...
private:
VERSION theClass;
};
}
using CpuMyClass = INTERFACE::MyClass<CpuMode>; //CpuMode defined elsewhere
#ifdef GPU_MODE
using MyClass = INTERFACE::MyClass<GpuMode>;
#else
using MyClass = INTERFACE::MyClass<CpuMode>;
#endif
从而允许外部代码自由地使用MyClass符号,相信它可以自动在模式之间切换。不幸的是,使用这个被证明是令人困惑的。例如,我有第二个类,我想为它写一个来自MyClass的actor:
#include "MyClass.hpp"
class OutsideClass{
public:
OutsideClass(const MyClass& A);
};
此函数触发"标识符'MyClass'未定义"错误。有人知道这是怎么回事吗?
你的意思是:
struct GpuMode { };
struct CpuMode { };
namespace INTERFACE {
// ~~~~~~~~^^^^^^
template <class VERSION>
class MyClass{
public:
MyClass() : theClass(){};
//more methods..
private:
VERSION theClass;
};
}
using CpuMyClass = INTERFACE::MyClass<CpuMode>; //CpuMode defined elsewhere
#ifdef GPU_MODE
using MyClass = INTERFACE::MyClass<GpuMode>;
#else
using MyClass = INTERFACE::MyClass<CpuMode>;
#endif
class OutsideClass{
public:
OutsideClass(const MyClass& A);
};
相关文章:
- 如果没有malloc,链表实现将失败
- 部分定义/别名模板模板参数
- 如何在c++中实现处理器调度模拟器
- 如何在c++中使用引用实现类似python的行为
- 实现无开销push_back的最佳方法是什么
- 如何在C++20中创建模板别名的推导指南
- 使用简单类型列表实现的指数编译时间.为什么
- 如何在BST的这个简单递归实现中消除警告
- 实现一个在集合上迭代的模板函数
- 我应该实现右值推送功能吗?我应该使用std::move吗
- 如何正确实现和访问运算符的各种自定义枚举器
- C++Union/Struct位域的实现和可移植性
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 在c++中实现LinkedList时,应出现未处理的错误
- 为左值和右值的包装器实现C++范围
- 使用模板进行堆栈实现; "name followed by :: must be a class or namespace"
- 使用GSoap实现ONVIF
- 如何自己为我自己的shared_ptr实现实现别名构造函数
- 类似数组的容器实现与严格的别名
- 使用完全专用的别名进行实现切换