我是为一个使用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中编写一个ctor:
#include "MyClass.hpp"
class OutsideClass{
public:
OutsideClass(const MyClass& A);
};此ctor触发“标识符'MyClass‘是未定义的”错误。有人知道这是怎么回事吗?
发布于 2015-09-17 22:50:59
你的意思是:
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);
};https://stackoverflow.com/questions/32640992
复制相似问题