Есть ли способ наложить ограничения на шаблоны классов? - PullRequest
3 голосов
/ 02 марта 2012

Мне просто интересно, смогу ли я создать шаблонный класс следующим образом:

template <class T> void DoSomething(T something);

но я хочу ограничить его, например, только float или int. Можно ли это сделать?

Ответы [ 4 ]

6 голосов
/ 02 марта 2012

Один из вариантов - использовать boost :: enable_if , который может быть использован для исключения вашей функции шаблона из рассмотрения в зависимости от типа, который представляет T. Например,

template <class T>
typename boost::enable_if<boost::is_arithmetic<T>, void>::type DoSomething(T t);

Ограничит функцию вашего шаблона целочисленными типами и типами с плавающей точкой.

1 голос
/ 02 марта 2012

да, взгляните на специализацию шаблонов.здесь- http://www.parashift.com/c++-faq-lite/templates.html#faq-35.7

0 голосов
/ 25 апреля 2018

За шесть лет, прошедших с тех пор, как об этом спросили, ситуация несколько улучшилась! Я опубликую краткое обновление.

std::enable_if теперь можно использовать в третьем месте, что избавляет от проблемы с некоторыми функциями, просто не имеющими места в подписи, чтобы прикрепить ее. Это должно использовать конечные фиктивные аргументы шаблона.

public:
    template<typename R ,
        typename = std::enable_if_t<is_range_t<R>::value>  >
    Fizzer_t (const R& range_of_itemdefs);

➽ Введение alias templates означает, что вам не нужно template::type везде! Одно это большое улучшение. Они также упрощают связывание ограничений для их повторного использования или просто детализируют их в другом месте, чем сигнатура ограниченной функции.

Выражение SFINAE и declspec означает, что вы можете просто показать тип синтаксиса кода, с которым вы хотите работать, и отклонить функцию, если это не так.

➽ Обработка возвращаемых типов работает вместе с этим, поэтому вы можете использовать аргументы функции вместе и иметь возможность поместить выражение SFINAE, чтобы выяснить его действительность.

➽ Выше, а также некоторые вещи, которые уже были выяснены и упакованы в форме библиотеки / идиомы, дают нам более идиоматические (читаемые) ограничения, включая идиома обнаружения .

constexpr был назван переломным моментом для метапрограммирования шаблонов в целом. Вам не нужно использовать метафункции для выполнения простой арифметики.

constru Конструкция if constexper может устранить необходимость написания таких ограничений как часть перегрузки!

➽ Если вы хотите быть на переднем крае, Concepts Lite почти готовы и уже являются экспериментальными в некоторых компиляторах. Существуют и другие решения для систематической эмуляции большинства из них.

0 голосов
/ 02 марта 2012

Также вы можете просто перегрузить функцию для всех поддерживаемых типов. В результате получается больше кода, чем при использовании (boost|std)::enable_if.

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