当前位置: 首页 > 知识库问答 >
问题:

在运行时获取元组元素

汝楷
2023-03-14

在阅读如何在运行时访问元组元素时,我想到了以下使用运行时索引获取元组元素的实现

我自己用GCC11.2试过了。我调用了API来检索元组,但出现了以下错误

找到下面的代码(实时演示)

#include <tuple>
#include <utility>
#include <type_traits>
#include <stdexcept>

template<
  typename Tuple,
  typename Indices=std::make_index_sequence<std::tuple_size<Tuple>::value>>
struct runtime_get_func_table;

template<typename Tuple,size_t ... Indices>
struct runtime_get_func_table<Tuple,std::index_sequence<Indices...>>{
    using return_type=typename std::tuple_element<0,Tuple>::type&;
    using get_func_ptr=return_type (*)(Tuple&) noexcept;
    static constexpr get_func_ptr table[std::tuple_size<Tuple>::value]={
        &std::get<Indices>...
    };
};

template<typename Tuple,size_t ... Indices>
constexpr typename
runtime_get_func_table<Tuple,std::index_sequence<Indices...>>::get_func_ptr
runtime_get_func_table<Tuple,std::index_sequence<Indices...>>::table[std::tuple_size<Tuple>::value];

template<typename Tuple>
constexpr
typename std::tuple_element<0,typename std::remove_reference<Tuple>::type>::type&
runtime_get(Tuple&& t,size_t index) {
    using tuple_type=typename std::remove_reference<Tuple>::type;
    if(index>=std::tuple_size<tuple_type>::value)
        throw std::runtime_error("Out of range");
    return runtime_get_func_table<tuple_type>::table[index](t);
}

int main() {
    std::tuple<int ,char,float> t;
    auto  a =  runtime_get(t,0);
}

共有1个答案

勾向文
2023-03-14

示例代码可以重写。因为在C中不可能有多个返回类型,所以您必须通过作为参数传递的lambda函数来获取它。这家伙在评论中也提到了同样的方法

#include <tuple>
#include <utility>
#include <type_traits>
#include <stdexcept>


template<
  typename Tuple,
  typename F,
  typename Indices=std::make_index_sequence<std::tuple_size<Tuple>::value>>
struct runtime_get_func_table;

template<typename Tuple, typename F, size_t I>
    void applyForIndex(Tuple& t, F f) {
        f(std::get<I>(t));
    }

template<typename Tuple, typename F, size_t ... Indices>
struct runtime_get_func_table<Tuple,F,std::index_sequence<Indices...>>{
    using FuncType = void(*)(Tuple&, F);
    static constexpr FuncType table[]={
        &applyForIndex<Tuple, F, Indices>...
    };
};

template<typename Tuple, typename F>
void runtime_get(Tuple& t,size_t index, F f) {
    using tuple_type=typename std::remove_reference<Tuple>::type;
    if(index>=std::tuple_size<tuple_type>::value)
        throw std::runtime_error("Out of range");
    runtime_get_func_table<tuple_type, F>::table[index](t, f);
}

int main() {
    std::tuple<int ,char, float> t(10, 's', 10.2);
    runtime_get(t, 0, [] (auto& v) {
      // Do something v = get<0>(t);
    });
}
 类似资料:
  • 问题内容: 在n = 5和k = 3的情况下,以下循环将执行此操作 但是效率不高,我想使用Banker的序列来完成,因此先探索单例,然后研究配对,然后研究三元组再停止。 我没有找到一种方法,但是至少此循环应该更有效: 还有:但是k个嵌入式循环看起来很丑 问题答案: 即使k个嵌入式循环看起来很丑,这也应该是最有效的方法

  • 主要内容:JavaTuples 获取元组值的方法,JavaTuples 获取元组值方法的特征,JavaTuples 获取元组值的示例JavaTuples 获取元组值的方法 元组具有 getValueX() 方法来获取值,而 getValue() 是一种通过索引获取值的通用方法。例如 Triplet 类具有以下方法。 getValue(index) :从 0 开始返回索引处的值。 getValue0() : 返回索引 0 处的值。 getValue1() : 返回索引 1 处的值。 getValu

  • 我在运行selenium TestCases时收到以下错误。使用版本Firefox45和selenium-server-standalone 2.52。

  • 这是我的问题。 我有一个像这样的简单表格(示例): null null 并且我正在尝试列的名称,同时单击元素。 我想这可能是一个简单的解决办法但我找不到。 提前致谢

  • 问题内容: 为了在控制台中进行调试,React中是否有任何机制可以使用DOM元素实例来获取支持的React组件? 先前已经在生产代码中使用此问题时询问过此问题。但是,我的重点是用于调试目的的开发版本。 我熟悉React的Chrome调试扩展,但是并非在所有浏览器中都可用。结合使用DOM Explorer和控制台,可以很容易地使用“ $ 0”快捷方式来访问有关突出显示的DOM元素的信息。 我想在调试

  • 我能够使用以下代码成功加载基于XML的属性文件: 我的财产文件代码 但是,当我运行这个时,我得到以下异常: 引起:org.xml.sax.SAXParseExc0019:元素类型属性的内容必须匹配(注释?,条目*)。在org.apache.xerces.util.ErrorHandlerWrapper.createSAXParseExc0019(未知来源)在org.apache.xerces.ut