【发布时间】:2019-12-09 11:26:22
【问题描述】:
//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 成员变量,它作为 Key 有一个数字,作为 Value a std::variant 包含描述类型和关联值的简单结构(//代码顶部的类型描述示例类)
所以我正在访问这个变体以检索关联类型并将其传递给_getVectorFromT(),以便能够转换为正确的类型并将其返回给调用者,在本例中返回将是std::vector<TextComponent>&
但是代码根本没有编译,如果你想自己试试看这里是完整的代码https://godbolt.org/z/Tq32jm
所以正如标题所说,我可以从 std::visit 返回 auto& 吗?
我需要这个,因为返回可能是std::vector<RectComponent>&、std::vector<ConstraintComponent>&、std::vector<TextComponent>& 等中的任何一个......
【问题讨论】:
-
所有 lambdas 都应该返回具有一些通用类型的类型。您不能返回不同的不相关类型。
-
std::visit返回一个具体类型。句号。auto可用于实现该目标,但最终结果必须是在编译时可推断的类型。 -
这种类型的想法存储在变体想法中是不是死路一条?还是有一种方法让我仍然可以利用它并在给定 int 的情况下返回正确的向量类型?
-
经验法则:一种表达式只能依赖于编译时已知的东西。
dataMapping[id].index()只在运行时知道,所以返回类型不能依赖它。 -
没有。 “正确的向量类型”必须是离散类型。它本身可以是
std::variant,访问者使用适当的变体成员构造。
标签: c++