C ++ "если тогда еще" замена шаблона - PullRequest
1 голос
/ 14 июня 2010

Я хотел бы объявить шаблон следующим образом:

template <typename T>
{ 
  if objects of class T have method foo(), then 
   const int k=1
  else 
   if class has a static const int L then
    const int k=L
   else 
    const int k=0;


}

Как я могу это сделать? В общем хотелось бы механизм для установки статических минусов основанный на свойствах T (или typedef, определенных внутри T).

Ответы [ 3 ]

5 голосов
/ 14 июня 2010

Внешняя часть, конечно, довольно проста.Используйте boost :: mpl :: if_, чтобы решить, какой тип int_ возвращать из вашей мета-функции, а затем получить доступ к значению в нем.Ничего страшного.

Часть, где вы пытаетесь выяснить, есть ли у типа X функция f (), все еще довольно проста, но, к сожалению, вы не найдете общего ответа.Каждый раз, когда вам понадобится такая проверка, вам придется написать собственную метафункцию, чтобы это выяснить.Используйте SFINAE:

  template < typename T >
  struct has_foo
  {
    typedef char (&no)  [1];
    typedef char (&yes) [2];

    template < void (T::*)() >
    struct dummy {};

    template < typename S >
    static yes check( dummy<&S::foo> *);

    template < typename S >
    static no check( ... );

    enum { value = sizeof(check<T>(0)) == sizeof(yes)  };
  };

Редактировать: Да, и создать средство проверки для статического констант L с помощью BOOST_MPL_HAS_XXX ()

0 голосов
/ 14 июня 2010

Используя boost enable_if , некоторые из таких функций могут быть реализованы с использованием черт. Но поскольку в C ++ отсутствуют вопросы для размышлений, такие как «содержит ли этот класс этот метод / член?» не легко решить

0 голосов
/ 14 июня 2010

Трудно ответить в текущей форме, потому что проблемная область не ясна.

Тем не менее, вы можете попробовать использовать технику для черт типа , которая расширяет ваш шаблонный класс, добавляя параметры, характерные только для объектов, имеющих тип T.

Я почти уверен, что использование черт типа может решить ваши проблемы, но их использование и написание / создание общих подпрограмм могут иногда быть сложными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...