如何在C ++中返回没有模板的泛型类型?

时间:2018-06-14 15:06:32

标签: c++

我希望创建一个可以返回泛型类型的方法,然后这个泛型类型可以由我明确定义的其他方法处理。

PCCommand CrossPlatform::GetCommandPC();
XboxCommand CrossPlatform::GetCommandXbox();

? CrossPlatform::GetCommand()
{
    #if PLATFORM == 1
        //PC
        return GetCommandPC();
    #elif PLATFORM == 2
        //xbox
        return GetCommandXbox();
    #endif

}

GetCommandPC和GetCommandXbox都返回不同的类型,那么如何在C ++中将它们作为泛型类型返回?模板的问题,除非我弄错了,我必须将一个类型传递给这个函数,但我不知道要传递什么类型,因为预处理器检查将确定哪个平台是被使用。

目前PCCommand和XboxCommand是枚举类,所以我不确定是否可以使用带有枚举类的基类型。

有没有办法实现这一目标,或者更好的方法来实现这一目标?

3 个答案:

答案 0 :(得分:6)

对于由#defines控制的跨平台类型:

PCCommand CrossPlatform::GetCommandPC();
XboxCommand CrossPlatform::GetCommandXbox();

#if PLATFORM == 1
    typedef PCCommand CrossPlatformCommand;
#elif PLATFORM == 2
    typedef XboxCommand CrossPlatformCommand;
#endif

CrossPlatformCommand CrossPlatform::GetCommand()
{
    #if PLATFORM == 1
        //PC
        return GetCommandPC();
    #elif PLATFORM == 2
        //xbox
        return GetCommandXbox();
    #endif

}

答案 1 :(得分:3)

由于您正在使用条件编译,并假设您只需要其中一种类型(即您正在运行的平台的类型);你能做的最干净的事情是拥有一个Command类型,在每种情况下都是正确的类型:

enum class Command
{
    #if PLATFORM == 1
        // PC
        // ...
    #elif PLATFORM == 2
        // xbox
        // ...
    #endif
};

以这种方式思考:当你在PC,其他平台的所有代码都是死代码(它不会被使用,它不会被编译,甚至可能无法编译!)。一般的良好做法是避免死lying!

答案 2 :(得分:1)

您可以使用继承。创建一个超类Command并生成PCCommand和XboxCommand子类,然后在函数中返回一个Command。