Как изменить тип члена класса C ++ - PullRequest
0 голосов
/ 27 января 2020

Можно ли иметь возможность назначить «гибкий» тип для члена класса? Это было бы похоже на std::variant или std::any, за исключением того, что std::variant требует, чтобы типы были указаны заранее, а std::any требует any_cast<Type> (что не проблема, за исключением сохранения информации о типе, поэтому я бы знать, к какому типу привести член std::any).

То, что я ищу, - это то, что делает возможной следующую функциональность:

class FlexType
{
    ChangeableType m_Value;

public:
    FlexType(SomeType init_value) 
        : m_Value(init_value)
    {}

    void setValue(SomeOtherType new_value) { m_Value = new_value; }
    CurrentType getValue() const { return m_Value; }
};

Редактировать Мне нужна функциональность для хранения типа возврата std::function, где я хочу иметь возможность изменить тип возврата std::function на любой данный тип. Это происходит из класса, который имеет метод virtual void run() const (для удобства назовите его «ParentClass»). Затем у меня есть дочерний класс, который переопределяет метод run() и запускает std::function и сохраняет возвращаемое значение в другом члене класса.

Это выглядит примерно так:

class ParentClass
{ // Example basic parent class
private:
    /* ... Class members ... */

public:
    ParentClass() = default;

    virtual void run() const { /* Do stuff w/ class members */ }
};

template<class FuncRetTy, class... FuncArgs>
class ChildClass : public ParentClass
{
private:
    using function_return_type = FuncRetTy;
    using function_arg_types = FuncArgs...;
    using function_args_container = std::tuple<function_arg_types>;
    std::function<function_return_type(function_args_container)>

    mutable function_return_type m_StoredValue;
    function_type m_Function;
    func_args_container m_Args;

public:
    FunctionMenu(
        function_return_type type_var, // Used to deduce return type
        function_type function,
        function_arg_types arguments)
        : m_Function(function)
        , m_Args(std::make_tuple(std::forward<FuncArgs>(arguments)...))
    {}

    void run() const override
    {
        m_StoredValue = m_Function(m_Args);
    }

    [[nodiscard]] function_return_type getStoredValue() const
    {
        return m_StoredValue;
    }

    // This is where my problem is...
    // I want to be able to set m_Function to another function,
    // but this means the return type can change, and so can
    // the tuple template parameters for m_Args.
    // The below code is just pseudocode
    template<class NewFuncRetTy, class... NewFuncArgs>
    void setFunction(
        NewFuncRetTy type_var,
        std::function<NewFuncRetTy(std::tuple<NewFuncArgs...>)> function
        NewFuncArgs... args)
    {
        // Change all class typedef's to new types
        // Reassign m_Function = function
        // Reassign m_Args = make_tuple(std::forward<NewFuncArgs>(args)...);
        // Delete whatever value m_StoredValue already has and 
        //     change type of m_StoredValue to NewFuncRetTy so
        //     getStoredValue() knows what type to return
    }
};

Мне жаль, что кода много, но я решил подробно объяснить, что именно я запрашиваю, чтобы помочь людям лучше понять вопрос.

...