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

时间:2015-09-17 22:32:45

标签: c++ templates c++11 template-specialization

我正在编写一个使用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;错误。有谁知道这里发生了什么?

1 个答案:

答案 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