【发布时间】:2019-08-14 18:59:18
【问题描述】:
我想创建一个通用基类,用于在数组中存储相同的接口类。但是,泛型类应该根据它的派生返回一个特定于类型的变量。
我尝试了使用模板和类型推导的不同设计方法...还尝试将实际值存储在嵌套类容器中。
我认为,我需要一种不同的方法而不是解决这个问题......但我不知道什么对我有用。 任何可以解决这种方法的设计模式?
基类
class IAlpha
{
public:
virtual auto Get() = 0;
};
派生类
template< typename T >
class Alpha:
public IAlpha
{
T x;
public:
Alpha( T _x ):x(_x)
{
}
auto Get() ->decltype(x) override
{
return x;
}
};
主要
IAlpha *i = new Alpha<int>(1);
IAlpha *d = new Alpha<double>(1.0);
int x = i->Get();
double y = d->Get();
我在 IAlpha::Get() 遇到的错误 "推导返回类型的函数不能是虚函数"
我了解问题,例如可以通过以下方式解决问题
virtual auto Get()->decltype( "TYPE" ) = 0;
但问题是接口不知道类型,它不应该保持它是通用的......
注意,
std::variant & std::any 很遗憾在我的应用程序中没有选项。
【问题讨论】:
-
您的目标不符合LSP。
-
@Ron 你可能也对curiously recurring template pattern感兴趣。
-
@RonSalm 这表明你的类架构存在严重的设计缺陷。可能只是缺少另一个级别的间接性。您应该阅读@StoryTeller 发布的链接。
-
@Hemil,界面中Get之类的虚函数不能是模板。
-
@RonSalm 拿到
int和double后,你会如何处理它们?那将是我要看的第一个地方。如果您可以概括该部分,您可能根本不需要知道IAlpha中包含的类型。
标签: c++ generics base-class