我只是想知道我是否可以像这样制作模板类:
template <class T> void DoSomething(T something);
但我想将其限制为仅采用浮点数或int值。可以这样做吗?
答案 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已经准备就绪,现在正在某些编译器中进行试验。存在其他解决方案以系统方式模仿其中的大部分。