Можно ли иметь возможность назначить «гибкий» тип для члена класса? Это было бы похоже на 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
}
};
Мне жаль, что кода много, но я решил подробно объяснить, что именно я запрашиваю, чтобы помочь людям лучше понять вопрос.