2017-04-06 54 views
1

我叫這裏的部分類型是類似的東西:手柄部分機型與升壓花

template < template <typename ...> typename Skeleton, 
      template <typename ...> typename WrapperType, 
      typename ... Pölicies > 
struct MetaStorage { 

    template < typename ... Ts > 
    struct With_Type { 

    using type = Skeleton<WrapperType<Ts...>, Policies...>; 
    }; 
}; 

using partialType = MetaStorage<Sk, Wt, P1, P2, P3>; 
using finalType = partialType::With_Type<T1, T2>; 

我不認爲它與花理念很合身,如果我想分裂型這不是可讀更有什者。

那麼用Boost Hana做這件事的有效方法是什麼?

編輯:

我的意思是,這是一種允許用戶創建幾個步驟的最後類型。就像那樣,他們可以使用一些部分類型來生成每個最終類型。但通常的語法和hana::type

+0

我不確定「這樣做的最有效方式」是什麼意思?做什麼? –

+0

@LouisDionne我希望編輯更清晰。 –

回答

2

使用Boost.Hana,您可以使用hana::type將類型提升爲值,並使用hana::template_與模板相同。這樣,您可以執行以下操作:

#include <boost/hana.hpp> 

namespace hana = boost::hana; 


template <typename ...X> struct skeleton_t { }; 
constexpr auto skeleton = hana::template_<skeleton_t>; 
template <typename ...X> struct wrapper_t { }; 
constexpr auto wrapper = hana::template_<wrapper_t>; 
template <int i> struct policy_t { }; 
template <int i> constexpr auto policy = hana::type_c<policy_t<i>>; 
template <int i> struct foo_t { }; 
template <int i> constexpr auto foo = hana::type_c<foo_t<i>>; 

int main() { 
    auto meta_storage = [](auto s, auto w, auto ...policies) { 
    return [=](auto ...ts) { 
     return s(w(ts...), policies...); 
    }; 
    }; 

    auto partial = meta_storage(skeleton, wrapper, policy<1>, policy<2>); 

    auto final_ = partial(foo<1>, foo<2>); 

    skeleton_t<wrapper_t<foo_t<1>, foo_t<2>>, policy_t<1>, policy_t<2>> check 
    = typename decltype(final_)::type{}; 
} 

我個人更喜歡不與情況下,我可以只使用一個功能hana::template_麻煩。我還使用一個宏創建一個標籤類型及其相應的值,以減少您在主函數上方看到的一些設置。

+0

一個lambda,返回一個lambda ...當我可以的時候,我應該做更多的Haskell。這實際上與結構相同,但具有價值類型,很好!我會等着看Louis Dionne是否有什麼要補充的東西,我會關閉它。謝謝:) –

+0

模板是類型的函數。使用Hana,類型函數被表示爲函數(這裏是泛型lambda),所以這將是正確的答案。對於像這樣簡單的事情,實際上是否值得使用Hana方法取決於您的實際使用情況,我會說。 –