2016-06-24 1 views
2

liés à this question Je me demandais si quelque chose comme cela serait réalisable d'une manière simple en utilisant boost :: hana:boost :: tuple hana déballage modèle variadique instanciation

#include <boost/hana.hpp> 
#include <boost/hana/unpack.hpp> 

namespace hana = boost::hana; 

template<typename ... T> 
struct A {}; 

int main() { 

    auto my_tuple = hana::tuple_t<int, double, float>; 

    // Is there any way to unpack my_tuple as template arguments for A? 
    // Something like 
    using MyStruct = A<hana::unpack_types(my_tuple)...>; 

    static_assert(std::is_same<MyStruct, A<int, double, float>>::value, "Ooops!"); 
} 
+0

Possible copie de http://stackoverflow.com/a/7858971/5922757 – Jezor

Répondre

7

Utilisez template_ pour soulever A dans un métafonction, puis appelez unpack:

using MyStruct = decltype(hana::unpack(my_tuple, hana::template_<A>))::type; 

Example.

1

Vous pouvez le faire vous-même avec:

template <template <typename...> class C, typename Tuple> struct RebindImpl; 

template <template <typename...> class C, typename ... Ts> 
struct RebindImpl<C, hana::tuple_t<Ts...>>{ 
    using type = C<Ts...>; 
}; 

template <template <typename...> class C, typename Tuple> 
using Rebind = typename RebindImpl<C, Tuple>::type; 
+0

Cela ne va pas faire ce que vous attendez! 'hana :: tuple_t ' est spécifié comme fonctionnellement équivalent à 'hana :: make_tuple (hana :: type {} ...)', excepté avec un type potentiellement différent. Donc d'abord, vous ne savez pas quel type vous obtenez, et deuxièmement, même si vous supposez qu'il est exactement le même que hana :: make_tuple (hana :: type {} ...) ', alors votre solution sera instancier 'C ...>', ce qui n'est pas ce que vous voulez. –

0

une façon simple de le faire si tout ce que vous aimez est à obtenir un type correct:

template <typename... Args> 
constexpr A<Args...> make_A(hana::tuple_t<Args...>) { 
    return {}; 
}