2010-07-27 4 views
3

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

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

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

ответ

3

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

+1

A-ha хочет отключить/включить создание шаблона на основе признаков типа. Boost Concept Check Library предназначена для расшифровки сообщений об ошибках компилятора, связанных с шаблоном. Он не делает то, что хочет А-ха. Он хочет отключить экземпляр шаблона для определенных типов, даже если он поддерживает все необходимые понятия. Например, double может поддерживать все, что он делает в теле функции, но он не хочет, чтобы шаблон использовался с двойным типом. Концепция проверки не является подходящим решением. enable_if и type_traits - путь. – user401947

+0

От своего вопроса: - «что требуется, чтобы быть допустимым аргументом шаблона». - «Я бы принял char, int, short unsigned и т. Д., Но ничего больше». (И кстати, мой ответ принят ;-)) – Scharron

5

Вы можете использовать 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) 
{ 
    ... 
} 
+0

Это путь. Библиотека проверки Boost Concept не подходит. – user401947

2

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

С 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, подталкивание поможет:

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

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

+0

Что не так с сообщением «no matching function to call»? Он укажет на то место, где неправильный аргумент подключен к функции. Что еще вы хотите? enable_if превосходит, потому что ваше решение будет мешать разрешению перегрузки. Может быть перегрузка foo (float), которая может соответствовать foo (3.14), но которая не будет вызываться, потому что функция шаблона выбрана над ней. – user401947

+0

@ rn141: Я сказал, что это зависит. * Если * не должно быть никаких других перегрузок, то «никакая соответствующая функция для вызова» - это довольно расплывчатая диагностика. – UncleBens

+0

+2 Мне очень нравится ваш ответ. –

Смежные вопросы