有没有办法限制模板类?

时间:2012-03-01 20:59:46

标签: c++ templates

我只是想知道我是否可以像这样制作模板类:

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

但我想将其限制为仅采用浮点数或int值。可以这样做吗?

4 个答案:

答案 0 :(得分:6)

一种选择是使用boost::enable_if,可以用来根据T代表的类型排除模板函数。例如,

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

将模板函数限制为整数和浮点类型。

答案 1 :(得分:1)

是的,看一下模板专业化。这里 - http://www.parashift.com/c++-faq-lite/templates.html#faq-35.7

答案 2 :(得分:0)

此外,您可以为所有支持的类型重载该功能。这会产生比使用(boost|std)::enable_if更多的代码。

答案 3 :(得分:0)

在被问到这六年后,情况有所改善!我会发布一个简短的更新。

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表达式以嗅出其有效性。

➽以上,加上一些已经被弄清楚并以库/成语形式打包的东西给了我们更多惯用(这种可读)约束,包括detection idiom

constexpr一般被称为模板元编程的游戏规则改变者。您不需要使用元函数来进行简单的算术运算。

if constexper构造可以消除在重载过程中编写这些约束的需要!

➽如果你想处于最前沿,Concepts Lite已经准备就绪,现在正在某些编译器中进行试验。存在其他解决方案以系统方式模仿其中的大部分。