簡體   English   中英

如何將 boost::mpl::vector 轉換為另一個 boost::mpl::vector?

[英]How to transform boost::mpl::vector into another boost::mpl::vector?

假設我有一個boost::mpl::vector " myvec ",定義如下:

using myvec = boost::mpl::vector<int, double, double>;

現在我想定義另一種類型 myvecex,它將每個myvec成員轉換為std::tuple並添加字符串。 我想得到一個這樣定義的類型:

using myvecex = boost::mpl::vector<std::tuple<int, std::string>, 
                                   std::tuple<double, std::string>,
                                   std::tuple<double, std::string> >;

但我不想重復自己並命名所有矢量成員。 相反,我想定義some_smart_template模板類型,我會以某種方式將每個成員類型轉換為元組的邏輯。

using myvecex2 = some_smart_template<myvec>; 
static_assert(std::is_same<myvecex, myvecex2>::value);

它在 C++ 中完全可行嗎?

Boost.MPL 不僅為您提供容器,它還為您提供針對這些容器的算法。 在這種情況下,您想要的是transform

template<
      typename Sequence
    , typename Op
    , typename In = unspecified
    >
struct transform
{
    typedef unspecified type;
};

語義是你給它一個序列,MPL 將其稱為Lambda 表達式,然后你得到另一個序列。 具體來說:

using B = mpl::transform<A,
    std::tuple<mpl::_1, std::string>
    >::type;

或者至少如果apply受支持的可變參數類模板(如std::tuple會起作用。 所以你只需要編寫一個操作,它要么是一個元函數類:

struct tuple_of_strings {
    template <class T>
    struct apply {
        using type = std::tuple<T, std::string>;
    };
};

using B = mpl::transform<A, tuple_of_strings>::type;

或元功能:

template <class T>
struct tuple_of_strings {
    using type = std::tuple<T, std::string>;
};

using B = mpl::transform<A, tuple_of_strings<_1>>::type;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM