我正在编写一个使用makefile规则在GPU和CPU实现之间切换的项目。我希望为用户代码提供一个界面,该界面可以自动在实现之间切换,而无需在整个地方编写#ifdef GPU_MODE。
我的解决方案是使用模板化接口类,后跟别名模板(只是typedef,真的,但我喜欢从左到右的样式),如下所示:
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写一个ctor:
#include "MyClass.hpp"
class OutsideClass{
public:
OutsideClass(const MyClass& A);
};
此ctor触发&#34;标识符&#39; MyClass&#39;未定义&#34;错误。有谁知道这里发生了什么?
答案 0 :(得分:1)
你的意思是:
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);
};
<强> Demo 强>