我们可以只为某些数据类型定义模板函数吗?

我们可以只为某些数据类型定义模板函数吗?

问题描述:

可能重复:
C++ templates that accept only certain types我们可以只为某些数据类型定义模板函数吗?

例如,如果我们想定义,我们可以使用整数模板功能,花车,双打,但不是字符串。有没有简单的方法来做到这一点?

+0

据我所知,不是在C++甚至是C++ 11中,但是如果我没有记错的话,旧的删除的关于概念的特征就会做到你想要的。 – Geoffroy 2011-12-29 18:10:52

+0

@Geoffroy:对此没有核心语言级别的支持,但使用enable_if可以完成(请参阅我的答案)。这可能有点麻烦,但我可以想象一些帮助类型,可以使用可变参数模板在C++ 2011中给出这种更好的语法(但我还没有尝试过)。 – 2011-12-29 18:16:49

+0

您是否想要为支持的类型应用相同的定义,还是需要为每个定义不同的定义?即'f '与'f '具有完全相同的身体吗? – 2011-12-29 18:18:14

以某种形状或形式使用std::enable_if的方法。然后将支持类型的选择器用作返回类型。例如:

template <typename T> struct is_supported { enum { value = false }; }; 
    template <> struct is_supported<int> { enum { value = true }; }; 
    template <> struct is_supported<float> { enum { value = true }; }; 
    template <> struct is_supported<double> { enum { value = true }; }; 

    template <typename T> 
    typename std::enable_if<is_supported<T>::value, T>::type 
    restricted_template(T const& value) { 
    return value; 
    } 

显然,你想给的特点一个更好的名字比is_supportedstd::enable_if是C++ 2011的一部分,但它很容易实现或从boost中获得,以防它不适用于您正在使用的标准库。

通常,由于模板实现通常具有隐式限制,因此通常不需要施加显式限制。但是,有时禁用或启用某些类型会有所帮助。

您可以检查值的类型。如果他们是你指定的类型之一,你可以继续,否则你可以返回该函数。 在这里查看更多的信息:http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Fthe_typeid_operator.htm

随着使用typeid你也应该能够抛出一个编译错误。

通常将某些类型列入白名单会极大地限制模板的使用。

Boost有所谓的concepts,它们基本上是模板的接口。 而不是将某些类型列入白名单,如果某些条件(函数缺失或错误的参数等)未得到满足,您可以创建编译时错误。当然你也可以使用它来限制你的模板参数为某些类型。