使用完全专用的别名进行实现切换

Implementation switching with fully-specialized aliases

本文关键字:实现 别名 专用      更新时间:2023-10-16

我正在为一个使用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);
};