【问题标题】:Can I return auto from a std::visit?我可以从 std::visit 返回 auto 吗?
【发布时间】: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&lt;3&gt;(),具有该成员函数的类有一个名为 dataMapping 的 std::map 成员变量,它作为 Key 有一个数字,作为 Value a std::variant 包含描述类型和关联值的简单结构(//代码顶部的类型描述示例类)

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

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

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

【问题讨论】:

  • 所有 lambdas 都应该返回具有一些通用类型的类型。您不能返回不同的不相关类型。
  • std::visit 返回一个具体类型。句号。 auto 可用于实现该目标,但最终结果必须是在编译时可推断的类型。
  • 这种类型的想法存储在变体想法中是不是死路一条?还是有一种方法让我仍然可以利用它并在给定 int 的情况下返回正确的向量类型?
  • 经验法则:一种表达式只能依赖于编译时已知的东西。 dataMapping[id].index() 只在运行时知道,所以返回类型不能依赖它。
  • 没有。 “正确的向量类型”必须是离散类型。它本身可以是 std::variant,访问者使用适当的变体成员构造。

标签: c++


【解决方案1】:

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

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

template<int id>
struct dataMapping;

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

【讨论】:

  • 已经尝试过了,导致我无法删除属于这样一个实体的所有组件的问题:``` for (auto it = entity.components.begin(); it!= entity .components.end(); it++) { using T = idTypefirst>; for (auto compId : it->second) { removeComponent(compId); } } ``` 行using T = idType&lt;it-&gt;first&gt;; 无效,因为必须在编译时知道,我的整个解决方案都是为了解决这个问题
  • @MarcusAseth 那么使用 auto 关键字是不可能的(必须评估编译时)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-22
  • 2023-03-27
  • 2019-08-06
  • 2019-09-09
  • 1970-01-01
  • 1970-01-01
  • 2021-05-27
相关资源
最近更新 更多