我想创建一个通用基类,用于在数组中存储相同的Interface类。但是,泛型类应根据其派生类返回特定于类型的变量。
我尝试了不同的设计方法,包括模板和类型推导......还尝试将实际值存储在嵌套的类容器中。
我想,我需要一种不同的方法而不是解决这个问题...但我不知道什么对我有用。任何可以解决这种方法的设计模式?
基类
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;
但问题是接口不知道TYPE而且它不应该保持它的通用性....
请注意,遗憾的是std::variant
和std::any
在我的应用程序中没有选项。
这个解决方案并不理想......但它会做到。
#include <iostream>
#include <assert.h>
#include <vector>
template< typename T >
class Param;
class IParam
{
protected:
public:
template< typename T>
const T& Get()
{
return static_cast< Param<T>* >(this)->Read();
};
};
template< typename T >
class Param:
public IParam
{
T *x;
public:
Param()
{
x = new T();
}
void Set( T _v)
{
*x = _v;
}
const T& Read()
{
return *x;
}
};
// This vector will be a Singleton Parameter Manager
std::vector<IParam*> mParameters;
class Alpha
{
private:
Param<int> *param;
public:
Alpha()
{
param = new Param<int>();
mParameters.push_back( param );
}
void Set()
{
param->Set(1);
}
};
int main ()
{
std::cout << "Starting Sandbox" << "\n";
Alpha *a = new Alpha();
// Attach to the Alpha parameter
const int& i = mParameters[0]->Get<int>();
// Print 0
std::cout << i << std::endl;
a->Set();
// Print 1
std::cout << i << std::endl;
return 0;
}