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

C++ 如何在C+;中返回没有模板的泛型类型+;?,c++,C++,我希望创建一个可以返回泛型类型的方法,然后这个泛型类型可以由我专门定义的其他方法处理 PCCommand CrossPlatform::GetCommandPC(); XboxCommand CrossPlatform::GetCommandXbox(); ? CrossPlatform::GetCommand() { #if PLATFORM == 1 //PC return GetCommandPC(); #elif PLATFORM ==

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

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

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

}
<> GetCommandPC和GETCuMdxBox都返回不同的类型,那么我如何将它们作为C++中的泛型类型返回?模板的问题是,除非我弄错了,否则我必须将类型传递到此函数中,但我不知道传递什么类型,因为预处理器检查将确定使用的是什么平台

目前,PCCommand和XboxCommand是枚举类,因此我不确定是否可以将基类型与枚举类一起使用


有什么方法可以实现这一点,或者有更好的方法来实现这一点吗?

您可以使用继承。创建一个超级类命令,使PCCommand和XboxCommand子类,然后在函数中返回一个命令。

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


因为您使用的是条件编译,并且假设您只需要其中一种类型(即您运行的平台的类型);您可以做的最干净的事情就是使用一个
命令类型,这在每种情况下都是正确的:

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

这样想:当你在例如PC上时,其他平台的所有代码都是死代码(它不会被使用,不会被编译,甚至可能无法被编译!)。一个普遍的良好实践是避免死掉的代码

可以使用空洞指针(VATE *),但是在访问内容之前应该将其转换为适当类型。请在C++中使用<代码> Vult*/Cuff>(假设这不是绝对必要的)。它非常不安全且容易出错。如果枚举不支持继承,我会将它们更改为类。与我的回答类似,但我会进一步避免定义/声明未使用的类型(及其相关函数)。我也会这样做(并使
GetCommand
包含由ifdef分隔的代码体),但GetCommandPC和GetCommandXbox的存在表明这些函数确实存在,并且需要返回类型。@MartinBonner:同意——因此我试图回答OP问题中的“实现这一点的更好方法?”部分。
enum class Command
{
    #if PLATFORM == 1
        // PC
        // ...
    #elif PLATFORM == 2
        // xbox
        // ...
    #endif
};