What is the advantage of std::enable_if over static_assert for class templates?
我想知道
但是这个参数对于类模板(和变量模板)是否合法?据我所知,那里没有涉及过载解决方案,这使得 SFINAE - 再次,据我所知 - 不相关,但我可能错了。如果是这样,你能举个例子吗?
如果不是,我认为
如您所说,可以通过专门化来处理几种不同的类型:
1 2 3 4 5 6 7 8 | template <class> class foo; template <> class foo <int> { /* int implementation */ }; template <> class foo <char> { /* char implementation */ }; |
现在考虑我们想要特化多种类型,并且我们希望
1 2 3 4 5 6 7 8 9 | class foo_fp_implementation { /* specialise for all floating point */ }; template <> class foo <float> : foo_fp_implementation {}; template <> class foo <double> : foo_fp_implementation {}; |
到目前为止,我们一直在避免使用 SFINAE,但是如果您想要一个使用特定接口的所有类型的专业化怎么办?示例:有方法
1 2 3 4 5 6 7 8 9 | template <class, class = int> class foo; template <class T> class foo <T, decltype(T().bar())> { // implement using bar interface }; // other specialisations... |
在上述情况下,
总之,SFINAE 有助于基于精确行为而不是精确类型进行专门化。
However is this argument legitimate for class templates (and variable templates)? As far as I know, there is no overload resolution involved there, making SFINAE - again, as far as I know - not relevant, but I might be wrong. If so, can you name an example?
您可以对课程模板进行专业化,并且 SFINAE 可用于在专业化之间进行选择。它还将阻止此类(到那时,可能是格式错误的)类/其专业化的实例化,而不是由于
而无法编译
std::enabled_if 在 SFIANE 中用于模板类、方法和...的特化。
static_assert 用于在编译时检查合约,并提供有用的错误消息。