2017-04-06 51 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方法取决于您的实际使用情况,我会说。 –