gpt4 book ai didi

c++ - 按索引访问元组元素 c++11

转载 作者:行者123 更新时间:2023-11-30 01:20:29 26 4
gpt4 key购买 nike

这不是 secret ,std::get<i>(tuple)惹恼了许多程序员。

取而代之,我想使用类似 tuple[i] 的东西.

所以我试着模拟了一下。

#include <iostream>
#include <type_traits>
#include <tuple>

template < int > struct index{};



template< char ... >
struct combine;

template<> struct combine<> : std::integral_constant< int , 0>{};


constexpr int ten(size_t p)noexcept
{
return p == 0 ? 1 : 10 * ten(p-1);
}

template< char c, char ... t>
struct combine<c, t...> : std::integral_constant< int, (c - '0')*ten(sizeof...(t)) + combine<t...>::value >
{ static_assert(c >= '0' && c <= '9', "only 0..9 digits are allowed"); };


template< char ... c >
constexpr auto operator "" _index()noexcept
{
return index< combine<c...>::value >{};
};

template< class ... Args >
struct mytuple : public std::tuple<Args...>
{
using std::tuple<Args...>::tuple;

template< int i >
auto& operator []( index<i> ) noexcept
{
return std::get< i > ( static_cast< std::tuple<Args...> & >(*this) );
}

template< int i>
auto const& operator [](index<i> )const noexcept
{
return std::get< i >(static_cast< std::tuple<Args...> const& >(*this) );
}

};


int main()
{
static_assert( combine<'1','2','3','4'>::value == 1234, "!");


static_assert( std::is_same< index<785>, decltype( 785_index ) > {}, "!");

using person = mytuple< std::string, int, double, char>;

person s = std::make_tuple("Bjarne Stroustrup", 63, 3.14, '7' );
auto name = s[ 0_index ];
auto old = s[ 1_index ];
auto number = s[ 2_index ];
auto symbol = s[ 3_index ];

std::cout << "name: " << name << '\t'
<< "old: " << old << '\t'
<< "number: " << number<< '\t'
<< "symbol: " << symbol<< '\t'
<< std::endl;
}

问:这段代码有什么问题?即此代码是否可用? 如果可用,为什么不可用 std::tuple是这样实现的?

最佳答案

我不太确定您的具体问题是什么,但您似乎正在寻找一些便利。以下使用占位符(以 _1 开头)来简化您的代码:

#include <iostream>
#include <type_traits>
#include <tuple>
#include <functional>

template< class ... Args >
struct mytuple : public std::tuple<Args...>
{
using std::tuple<Args...>::tuple;

template< typename T >
auto& operator []( T ) noexcept
{
return std::get< std::is_placeholder<T>::value - 1 >( *this );
}

template< typename T >
auto const& operator []( T ) const noexcept
{
return std::get< std::is_placeholder<T>::value - 1 >( *this );
}
};

int main()
{
using person = mytuple< std::string, int, double, char>;

using namespace std::placeholders;

person s = std::make_tuple("Bjarne Stroustrup", 63, 3.14, '7' );
auto name = s[ _1 ];
auto old = s[ _2 ];
auto number = s[ _3 ];
auto symbol = s[ _4 ];

std::cout << "name: " << name << '\t'
<< "old: " << old << '\t'
<< "number: " << number<< '\t'
<< "symbol: " << symbol<< '\t'
<< std::endl;
}

这里的技巧是知道 std::is_placeholder<T> 保证派生自 std::integral_constant<int,N> :) 希望你喜欢。

关于c++ - 按索引访问元组元素 c++11,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19293382/

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