C++ 有没有办法限制模板类?

C++ 有没有办法限制模板类?,c++,templates,C++,Templates,我只是想知道我是否可以制作这样一个模板类: template void DoSomething(T something) 但我想把它限制为仅以浮点或int为例。可以这样做吗?是的,请查看模板专门化。此处-一个选项是使用,根据T表示的类型,可以使用该选项排除模板函数。比如说, template <class T> typename boost::enable_if<boost::is_arithmetic<T>, void>::type DoSomething(

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

template void DoSomething(T something)


但我想把它限制为仅以浮点或int为例。可以这样做吗?

是的,请查看模板专门化。此处-

一个选项是使用,根据T表示的类型,可以使用该选项排除模板函数。比如说,

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

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

也可以为所有支持的类型重载函数。这会产生比使用
(boost | std)更多的代码:启用_如果

在提出这一问题的六年中,情况有所改善!我会发布一个简短的更新

std::enable_if
现在可以在第三个位置使用,这解决了一些函数在签名中没有位置粘贴的问题。这是为了使用尾随的伪模板参数

public:
    template<typename R ,
        typename = std::enable_if_t<is_range_t<R>::value>  >
    Fizzer_t (const R& range_of_itemdefs);
公共:
模板
起泡器(项目定义的常数和范围);
➽ 引入
别名模板
意味着您不需要
模板
⋯<代码>::到处键入
!这本身就是一大进步。它们还可以更容易地捆绑约束以重用它们,或者简单地在受约束函数的签名之外的其他地方详细描述它们

➽ 表达式SFINAE和
declspec
,意味着您可以轻松地显示您想要使用的代码语法类型,如果不是这样,则拒绝该函数

➽ 训练返回类型与此配合使用,因此您可以将函数的参数一起使用,并且可以放置SFINAE表达式来探查其有效性

➽ 上面的内容,加上一些已经计算出来并打包成库/习惯用法形式的内容,为我们提供了更多的习惯用法(这种可读性)约束,包括

constexpr
通常被称为模板元编程的游戏规则改变者。你不需要使用元函数来做简单的算术

if constexper
构造可以消除作为重载一部分编写此类约束的需要


➽ 如果你想走在最前沿,你几乎已经准备好了,并且正在一些编译器中进行实验。其他解决方案可以系统地模拟大部分输入。

专门化不会限制输入的类型。它基于输入进行专门化。是的,您可以为float或int或任何您想要的类型提供专门化,而对于您不想要的类型,您只需要使用默认实现,可以什么都不做。我希望我有点道理?使用这个方法,您最多可以让它在运行时为非算术类型抛出一个异常。正如rkjnsn在回答中所建议的那样,最好在编译时检查这个问题。@AlexKorban如果不定义默认实现,那么构建将失败。但是,如果函数模板的唯一有效实例化是专门化版本,那么通常只使用重载会更好。那么专门化和重载之间的区别是什么?或者,如果使用C++11,它的
std::enable_if
基本上是一样的。那么你会为char数组做什么呢?@AlexKorban我的理解是
std::enable_if
的功能实际上与
boost::enable_if_c
的功能相同,所以你需要
std::enable_if
@Pittfall来测试T是否是char[],我们可以做
boost::enable_if_c
(或
std::enable_if
)删除类型中的最后一个数组下标(如果有)。我应该添加这一点以限制特定类型,如char[],重载可能是更好的选择。当您希望接受多个都符合特定条件的类型时,启用_if最有用。例如,如果要接受任何整数类型的数组:
boost::enable_if_c