gpt4 book ai didi

c++ - 从参数包创建索引和类型对

转载 作者:搜寻专家 更新时间:2023-10-31 02:15:16 24 4
gpt4 key购买 nike

我正在尝试创建一个元组或成对的索引参数包。

下面是代码想要实现的示例:

  {
using Indices =
std::tuple< IndexTypePair< 0, int >, IndexTypePair< 1, int >, IndexTypePair< 2, float > >;
test2< Indices, 0 >();
test2< Indices, 1 >();
test2< Indices, 2 >();
}

这里是概括:

  {
template < typename... T >
using make_index_tuple = tuple< IndexTypePair< Index_v< T, T... >, T >... >;
using Indices = make_index_tuple< int, int, float >;
test2< Indices, 0 >();
test2< Indices, 1 >();
test2< Indices, 2 >();
}

此解决方案基于以下问题的答案: How to get the index of a type in a variadic type pack?

我遇到的问题之一是创建可变参数模板别名,之前的代码给出了以下错误:

$ make index-sequence clang++-3.8 -Wall -Werror -Wextra -std=c++14
-pedantic -Wconversion -stdlib=libc++ -O3 -pthread index-sequence.cpp -o index-sequence index-sequence.cpp:50:5: error: expected expression
template < typename... T >
^ index-sequence.cpp:52:21: error: unknown type name 'make_index_tuple'
using Indices = make_index_tuple< int, int, float >;
^ ...

这里有一些其他的点点滴滴来使这段代码工作:

#include <array>
#include <cstddef>
#include <iostream>
#include <type_traits>
#include <utility>

template < typename T, typename... Ts >
struct Index;

template < typename T, typename... Ts >
struct Index< T, T, Ts... > : std::integral_constant< std::size_t, 0 >
{
};

template < typename T, typename U, typename... Ts >
struct Index< T, U, Ts... > : std::integral_constant< std::size_t, 1 + Index< T, Ts... >::value >
{
};

template < typename T, typename... Ts >
constexpr std::size_t Index_v = Index< T, Ts... >::value;

template < size_t i, typename T >
struct IndexTypePair
{
static constexpr size_t index{i};
using Type = T;
};

template < typename Idx, size_t i >
void test2()
{
using ITP = typename std::tuple_element< i, Idx >::type;
typename ITP::Type v{};
//....
std::cout << ITP::index << ' ' << v << std::endl;
}

最佳答案

使用嵌套结构设置和标准 make_index_sequence 来帮助您:

template < typename ... T >
struct make_index_type_tuple_helper
{
template< typename V >
struct idx;

template< size_t ... Indices >
struct idx<std::index_sequence<Indices...>>
{
using tuple_type = std::tuple<IndexTypePair<Indices, T>...>;
};

using tuple_type = typename idx<std::make_index_sequence<sizeof...(T)>>::tuple_type;
};

template < typename ... T>
using make_index_type_tuple = typename make_index_type_tuple_helper<T...>::tuple_type;

然后你就可以按照你想要的方式使用它了(live demo):

using Indices = make_index_type_tuple< int, int, float >;
test2< Indices, 0 >();
test2< Indices, 1 >();
test2< Indices, 2 >();

关于c++ - 从参数包创建索引和类型对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38746040/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com