c++ - Copying parameter pack from one template to another and using result simultaneously in inner alias -
i've shrunk problem down code fails compile:
#include <tuple> template <class... left> struct split { template <class... right> using type = std::tuple<std::pair<left,right>...>; }; template <template<class...>class result> struct deduce { template <template<class...>class source, class... parameters> constexpr static result<parameters...> type_from_ret(source<parameters...>); template <typename source> using type = decltype(type_from_ret(std::declval<source>())); }; int main() { deduce<split<>::type>::template type<std::tuple<>> a; return 0; }
giving:
in substitution of 'template<class ... left> template<class ... right> using type = std::tuple<std::pair<left, right>...> [with right = {parameters ...}; left = {}]': 19:41: required 'struct deduce<split<>::type>' 26:23: required here 13:51: error: mismatched argument pack lengths while expanding 'std::pair<left, right>' using type = std::tuple<std::pair<left,right>...>;
is error or compiler error? there way form these simultaneous pairs (one exact type, 1 outer class) succeed?
i've been using struct deduce
approach copy parameter packs templated class type template in generic way. it's been working fine until use simultaneous packs. i'm not attached particular solution.
the problem i'm trying solve involves enforcing compile-time requirements on parameter packs passed base class. have couple struct split
-like requirements templates derived classes select template parameters , pass type parameter templated based class, along tuple type of value types using. hoping base class exercise sfinae allow derived class used if argument types passed checks enforced requirements type. don't have add bunch of enable_if's every single derived class, there few classes of these checks.
i'm sending std::tuple type base class rather straight parameter pack because parameter pack terminates template parameter list, , don't have anywhere put enable_if check requirements. i'm attempting copy parameter pack out of tuple, not working because of issue. way make use of sfinae on class takes parameter pack (where sfinae relies on contents of pack) work well.
i resolved issue replacing deduce's pattern of determining return value of overloaded function simpler mp_rename
template specialization seen @ http://pdimov.com/cpp2/simple_cxx11_metaprogramming.html
template <template<class...>class result, class source> struct deduce; template <template<class...>class result, template<class...>class source, class... parameters> struct deduce<result,source<parameters...>> { using type=result<parameters...>; }; int main() { deduce<split<>::type,std::tuple<>> a; return 0; }
Comments
Post a Comment