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
};