具有完全专用别名的实现切换
Implementation switching with fully-specialized aliases
我正在为一个使用 makefile 规则在 GPU 和 CPU 实现之间切换的项目写作。我想为用户代码提供一个界面,该界面可以在实现之间自动切换,而不必到处写#ifdef GPU_MODE。
我的解决方案是使用模板化接口 class,然后使用别名模板(实际上只是 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,相信它会自动在模式之间切换。不幸的是,使用它被证明是令人困惑的。例如,我有第二个 class 我想从 MyClass 写一个 ctor:
#include "MyClass.hpp"
class OutsideClass{
public:
OutsideClass(const MyClass& A);
};
此构造函数触发 "identifier 'MyClass' is undefined" 错误。有人知道这里发生了什么吗?
你的意思是:
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);
};
我正在为一个使用 makefile 规则在 GPU 和 CPU 实现之间切换的项目写作。我想为用户代码提供一个界面,该界面可以在实现之间自动切换,而不必到处写#ifdef GPU_MODE。
我的解决方案是使用模板化接口 class,然后使用别名模板(实际上只是 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,相信它会自动在模式之间切换。不幸的是,使用它被证明是令人困惑的。例如,我有第二个 class 我想从 MyClass 写一个 ctor:
#include "MyClass.hpp"
class OutsideClass{
public:
OutsideClass(const MyClass& A);
};
此构造函数触发 "identifier 'MyClass' is undefined" 错误。有人知道这里发生了什么吗?
你的意思是:
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);
};