【发布时间】:2021-10-26 05:46:36
【问题描述】:
阅读如何在运行时访问元组元素,我落入了以下实现 getting-tuple-elements-with-runtime-index
我自己使用 gcc 11.2 尝试过。我调用了用于检索元组的 API,但出现以下错误
: 在 'constexpr std::tuple_element >::type& (* const runtime_get_func_table, std::integer_sequenceunsigned int, 0, 1, 2> >::table [3])(std::tuple&) noexcept'的实例化中: :32:53: 'constexpr typename std::tuple_elementstd::remove_reference::type>::type& runtime_get(Tuple&&, size_t) [with Tuple = >std::tuple&;类型名 std::tuple_elementstd::remove_reference::type>::type = int;类型名 std::remove_reference::type = >std::tuple; size_t = long unsigned int]' :37:37: 从这里需要 :15:35: 错误:没有匹配转换函数 'get' 到类型 'const get_func_ptr' {aka >'int& (* const)(class std::tuple&) noexcept'} 15 | static constexpr get_func_ptr table[std::tuple_size::value]={
找到下面的代码(live demo)
#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);
}
【问题讨论】:
-
此实现要求所有元组元素具有相同的类型,这在很大程度上违背了元组的初衷,并且您会抱怨编译器错误。
-
对于不同的类型你需要使用回调,比如here。
标签: c++ templates tuples c++17 variadic-templates