C ++ - тип черты вопроса - PullRequest
       7

C ++ - тип черты вопроса

4 голосов
/ 19 октября 2010

Я хотел бы знать, возможно ли в C ++ как-то обрабатывать следующие ситуации:

Ситуация 1) (Легко обрабатывается)

class BasicFacility { }

template <typename U1, typename U2> class Facility : public BasicFacility { }

Предположим теперь, что мы хотим получить какое-то утверждение во время компиляции и хотим проверить, моделирует ли произвольный тип typename T Facility.Это довольно просто:

(boost::is_base_of<BasicFacility, T>::type)

Ситуация 2) (???)

Теперь давайте предположим, что в той же ситуации мы простоесть наш класс шаблона:

template <typename U1, typename U2> class Facility { }

Очевидно, что мы не можем использовать одно и то же решение из ситуации один , потому что мы не можем написать statement<Facility, T> (Facility сам шаблон).

Итак, есть ли способ (возможно, грязный, включающий уродливые приведения, специфичные для выравнивания, НИЧЕГО, что может сработать) , чтобы проверить, действительно ли некоторые T равны template type без введения конкретных пустых (вспомогательных) базовых классов (потому что иногда вы просто не можете)?

Спасибо.

Ответы [ 2 ]

8 голосов
/ 19 октября 2010

Провести собственный тест довольно просто:

template <typename T>
struct is_facility : public boost::false_type { };

template <typename U1, typename U2>
struct is_facility< Facility<U1, U2> > : public boost::true_type { };
4 голосов
/ 19 октября 2010

IIUC, вы хотите убедиться, что определенный параметр шаблона является экземпляром шаблона Facility.Это просто:

template< typename Policy >
struct some_template; // note: only declared

template< typename U1, typename U1 >
struct some_template< Facility<U1,U2> > {
  // implementation
};

Конечно, вы также можете обобщить / формализовать это:

template< typename T >
struct AssertFacility {}; // note: empty

template< typename U1, typename U2 >
struct AssertFacility< Facility<U1,U2> > {
  typedef Facility<U1,U2> result_t;
};

template< typename Policy >
class some_class {
  typedef AssertFacility<Policy>::result_t just_an_assertion;
public: 
  // more stuff
};
...