Вопрос

Я хочу знать, можно ли в 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 Без внедрения конкретных пустых (вспомогательных) базовых классов (потому что иногда вы просто не можете)?

Спасибо.

Это было полезно?

Решение

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
};

Другие советы

Это довольно просто, чтобы свернуть собственный тест:

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 { };
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top