基类需要根据派生的特定类型返回自动类型

问题描述 投票:1回答:1

我想创建一个通用基类,用于在数组中存储相同的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::variantstd::any在我的应用程序中没有选项。

c++ generics base-class
1个回答
0
投票

这个解决方案并不理想......但它会做到。

#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;
}
© www.soinside.com 2019 - 2024. All rights reserved.