Указание аргумента шаблона - PullRequest
3 голосов
/ 27 июля 2010

Как я могу указать, что должно быть допустимым аргументом шаблона?Я имею в виду, что, например, давайте возьмем что-то вроде этого:

template<class T>
void f(const T& obj)
{
//do something with obj
} 

, но я бы хотел, чтобы T был только целочисленным типом, поэтому я бы принял char, int, short без знака и т. Д., Но ничего больше.Есть ли (я уверен, что есть) способ обнаружить его, который предоставляется в качестве шаблона arg?
Спасибо.

Ответы [ 3 ]

5 голосов
/ 27 июля 2010

Вы можете использовать boost :: enable_if и boost :: is_integral (также входит в TR1):

#include <boost/utility/enable_if.hpp>
#include <boost/type_traits/is_integral.hpp>

template <typename T>
typename boost::enable_if<boost::is_integral<T> >::type
f(const T & obj)
{
    ...
}
3 голосов
/ 27 июля 2010

Посмотрите на проверку концепции (http://www.boost.org/doc/libs/1_43_0/libs/concept_check/concept_check.htm).

2 голосов
/ 27 июля 2010

Если вы хотите, чтобы нецелочисленные типы вызывали ошибку компиляции, вы также можете утверждать статически (утверждения времени компиляции).

С C ++ 0x:

#include <utility>

template <class T>
void foo(T )
{
    static_assert(std::is_integral<T>::value, "Only integral types allowed");
}

int main()
{
    foo(3);    //OK
    foo(3.14); //makes assertion fail
}

СC ++ 03, boost поможет:

#include <boost/type_traits.hpp>
#include <boost/static_assert.hpp>

template <class T>
void foo(T )
{
    BOOST_STATIC_ASSERT(boost::is_integral<T>::value);
}

int main()
{
    foo(3);
    foo(3.14);
}

(IMO, enable_if - для сценариев, в которых вы хотите включить другую версию функции для других типов и избежать ошибки. Если вы хотитеошибка для всех других типов, когда функция отключена, вы можете просто получить не слишком полезное сообщение: «нет соответствующей функции для вызова», которая даже не указывает на место в коде, где нецелые числа запрещены.)

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