指定模板参数

时间:2010-07-27 08:37:53

标签: c++ templates

如何指定有效模板参数所需的内容?我的意思是让我们举个例子:

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

但我希望T只是整数类型,所以我会接受char,int,short unsigned等,但没有别的。是否(我确定有)一种方法来检测它作为模板arg提供什么? 谢谢。

3 个答案:

答案 0 :(得分:5)

您可以使用boost::enable_ifboost::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)
{
    ...
}

答案 1 :(得分:3)

答案 2 :(得分: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,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适用于您希望为其他类型启用该功能的某些其他版本并避免出错的情况。如果您希望所有其他类型的错误,禁用该功能,可能只是得到一个不太有用的消息:“没有匹配的函数来调用”,它甚至没有指向代码中不允许非整数的地方。)