2016-12-19 7 views
2

:: 튜플을 수 std 포인터와 const를 추가를 C++11 템플릿의 마법을 사용하여 다음내가 달성하기 위해 노력하고있어 <Types...>

한다고 가정 나는이 같은 유형이 있습니다

using my_types = std::tuple<char, int, float>; 

이 데, 나는 모두 const이 아닌 값으로 포인터의 튜플을 좀하고 싶습니다 예 :

std::tuple<char *, int *, float *, const char *, const int *, const float *>; 

내 솔루션을 현재 :

template<typename T> 
struct include_const {}; 

template<typename... Types> 
struct include_const<std::tuple<Types...>> { 
    using type = std::tuple<Types..., typename std::add_const<Types>::type...>; 
}; 

이것은 std::tuple<types, const types>입니다. 이 작품

template<typename T> 
struct add_ptr {}; 

template<typename... Types> 
struct add_ptr<std::tuple<Types...>> { 
    using type = std::tuple<typename std::add_pointer<Types>::type...>; 
}; 

,하지만 난 좀 더 일반적인 얻을이 좋아하는 것 : 포인터를 얻으려면, 내가 사용할 수 있습니다 내가 나에게 모두 Types...trait<Types>::type...에 대한 포인터를 제공하는 template<trait, Types...> add_ptr을 갖고 싶어, 그래서 사용은 할 수

add_ptr<std::add_const, my_types> 내가 add_ptr<std::add_volatile, my_types> 전에 언급 한 튜플 std::tuple<char *, volatile char *, ...>

내가이 달성 할 수있는 방법에 대한 몇 가지 힌트를 부탁드립니다 제공 : 다음과 같은합니다. 나는 그런

add_ptr<std::add_const, my_types>::type 

이 될 것입니다 아직 템플릿 마술사있어 어떤 도움

답변

5

템플릿 템플릿 매개 변수

template<template<typename> class Trait, typename U> 
struct add_ptr {}; 

template<template<typename> class Trait, typename... Types> 
struct add_ptr<Trait, std::tuple<Types...>> { 
    using type = std::tuple< 
        typename std::add_pointer<Types>::type..., 
        typename std::add_pointer< 
         typename Trait<Types>::type 
        >::type... 
       >; 
}; 

에게 사용을 부탁드립니다

std::tuple<char *, int *, float *, char const *, int const *, float const *> 

Live demo