спецификация шаблонов функций - PullRequest
3 голосов
/ 04 декабря 2011

Я хотел бы создать шаблон функции, в котором класс T ограничен только производными классами специального базового класса T_base. Каков эффективный способ сделать это? Спасибо за вашу помощь!

Ответы [ 3 ]

7 голосов
/ 04 декабря 2011

Вы можете использовать черты типа и SFINAE

template<typename T, 
         bool[std::is_base_of<T_base, T>::value] = nullptr>
void f(T const&);

версия C ++ 03, которая также работает для C ++ 11

template<typename T>
typename boost::enable_if< boost::is_base_of<T_base, T> >::type 
f(T const&);

Существует версия C ++ 11перемещая enable_if в список параметров шаблона, используя аргумент по умолчанию

template<typename T, 
         typename = typename std::enable_if<
           std::is_base_of<T_base, T>::value>::type>
void f(T const&);

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

1 голос
/ 04 декабря 2011

C ++ 0x имеет std::enable_if; если ваш компилятор еще не поддерживает, есть boost::enable_if.

Например, если бы подпись была template<typename T> int f(T&), вы бы использовали

template<typename T>
  std::enable_if<std::is_base_of<T_base, T>::value, int>::type f(T&);
0 голосов
/ 04 декабря 2011

Самый простой способ, которым я могу придумать, будет примерно таким:

template<class T>
void someFunc(T arg)
{
    dynamic_cast<BaseClass>(arg); // will throw an exception if not castable to base class
    // continue...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...