简体   繁体   English

如何在编译时替换元组元素?

[英]How do I replace a tuple element at compile time?

Is there a way to replace a tuple element at compile time ? 有没有办法在编译时替换元组元素?

For example, 例如,

using a_t = std::tuple<std::string,unsigned>;  // start with some n-tuple
using b_t = element_replace<a_t,1,double>;     // std::tuple<std::string,double>
using c_t = element_replace<b_t,0,char>;       // std::tuple<char,double>

You can use this: 你可以用这个:

// the usual helpers (BTW: I wish these would be standardized!!)
template< std::size_t... Ns >
struct indices
{
    typedef indices< Ns..., sizeof...( Ns ) > next;
};

template< std::size_t N >
struct make_indices
{
    typedef typename make_indices< N - 1 >::type::next type;
};

template<>
struct make_indices< 0 >
{
    typedef indices<> type;
};

// and now we use them
template< typename Tuple, std::size_t N, typename T,
          typename Indices = typename make_indices< std::tuple_size< Tuple >::value >::type >
struct element_replace;

template< typename... Ts, std::size_t N, typename T, std::size_t... Ns >
struct element_replace< std::tuple< Ts... >, N, T, indices< Ns... > >
{
    typedef std::tuple< typename std::conditional< Ns == N, T, Ts >::type... > type;
};

and then use it like this: 然后像这样使用它:

using a_t = std::tuple<std::string,unsigned>;     // start with some n-tuple
using b_t = element_replace<a_t,1,double>::type;  // std::tuple<std::string,double>
using c_t = element_replace<b_t,0,char>::type;    // std::tuple<char,double>

You can access the types of the elements of a tuple type using std::tuple_element . 您可以使用std :: tuple_element访问元组类型的元素类型。 This does not actually allow you to replace tuple element types, but it allows you to define tuple types in terms of types used as element types in other tuple types. 这实际上不允许您替换元组元素类型,但它允许您根据在其他元组类型中用作元素类型的类型来定义元组类型。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM