我可以从标准::访问返回汽车吗?

Can I return auto from a std::visit?

本文关键字:汽车 返回 访问 标准 我可以      更新时间:2023-10-16
//type description example
class TextComponent_type : public _type 
{
public: 
using type = TextComponent; 
static constexpr uInt value = 3;
};
//...
//ECSData member functions
template<uInt id>
auto& getVector()
{
return std::visit([this] (auto&& T_type)->(auto&) {
using T = typename std::decay_t<decltype(T_type)>::type;    
return _getVectorFromT<T>();
}, dataMapping[id]);
}
template<typename T>
std::vector<T>& _getVectorFromT()
{
void* voidPtr = data[decltype(T::type)::value].get();
std::vector<T>* vec = static_cast<std::vector<T>*>(voidPtr);
return *vec;
}

在上面的代码中,我有一个函数,旨在用一个数字调用,例如getVector<3>(),具有该成员函数的类具有一个名为 dataMapping 的 std::map 成员变量,该变量作为键有一个数字,作为值有一个 std::variant 保存描述类型和关联值的简单结构(代码顶部的//type 描述示例类(

所以我正在访问这个变体来检索关联的类型并将其传递给_getVectorFromT()以便能够转换为正确的类型并将其返回给调用方,在本例中,返回将是一个std::vector<TextComponent>&

但是代码根本没有编译,如果你想自己尝试一下,这里是完整的代码 https://godbolt.org/z/Tq32jm

所以正如标题所说,我可以从std::visit返回auto&吗? 我需要这个,因为回报可以是std::vector<RectComponent>&std::vector<ConstraintComponent>&std::vector<TextComponent>&等中的任何一个......

您尝试执行此操作的方式是不可能的 - 必须在编译时推断类型。

dataMapping[id]返回相同的类型 - 您可以将此部分转换为基于特征的设计 ala。

template<int id>
struct dataMapping;
template<>
struct dataMapping<0> {
using type = int; //... or whatever
}
//and so on