Вывести пакет параметров без передачи его явно в качестве параметра шаблона? - PullRequest
2 голосов
/ 17 мая 2011

Прошу прощения за любое незнание дедукции типов C ++, но я хотел бы иметь возможность носить определение пакета параметров, чтобы позже я мог проверить внутренний тип.Это возможно?Что-то вроде:

template <typename... Args> struct Entity {

    struct Inner {
        typedef Args... entity_args_t;
    };

    struct SomeOtherInner {
        typedef Args... entity_args_t;
    };
};

struct ThingA : Entity<int, string> {
};

struct ThingB : Entity<string, string> {
};

//Want to accept variations of Entity<...>::Inner,
//not Entity<...>::SomeOtherInner
template<typename I>
struct is_Entity_Inner {
    static const bool value
        = is_same<
            typename Entity<typename I::entity_args_t...>::Inner
            , I
        >::value
    ;
};

Oui?Non

1 Ответ

2 голосов
/ 17 мая 2011

Определить:

template<typename ...> struct types;

Затем:

template <typename... Args> struct Entity {

    struct Inner {
        typedef types<Args...> entity_args_t;
    };

    struct SomeOtherInner {
        typedef types<Args...> entity_args_t;
    };
};

Затем вы можете передать entity_args_t шаблону, который имеет частичную специализацию для types<T...>.Если вы наберете Entity, вы можете вместо этого написать частичную специализацию для Entity<T...>, что может иметь больше смысла для вашего случая

template <typename... Args> struct Entity {

    struct Inner {
        // Equivalent: typedef Entity entity_args_t;
        typedef Entity<Args...> entity_args_t;
    };

    struct SomeOtherInner {
        typedef Entity<Args...> entity_args_t;
    };
};

Таким образом, наличие typedef для entity_args_t равно Entity<Args...>,Вы можете написать это следующим образом (не проверено, но должно работать):

template<typename ProbablyInner, typename ProbablyEntity>
struct is_inner_impl : std::false_type 
{ };

template<typename ProbablyInner, typename ...Args>
struct is_inner_impl<ProbablyInner, Entity<Args...>> 
  : std::is_same<
      typename Entity<Args...>::Inner
      ProbablyInner>
{ };

template<typename ProbablyInner, typename = std::true_type>
struct is_inner : std::false_type 
{ };

template<typename ProbablyInner>
struct is_inner<ProbablyInner, 
  std::integral_constant<bool, is_inner_impl<
    ProbablyInner, 
    typename ProbablyInner::entity_args_t>::value>>
  : std::true_type 
{ };
...