[英]Template method enable_if specialization
我有以下不编译的代码。 这是接受参数的模板类中的两个函数
typename std::enable_if<std::is_void<Ret>::value, Ret>::type _on_dispatched() {
// ...
}
typename std::enable_if<!std::is_void<Ret>::value, Ret>::type _on_dispatched() {
// ....
}
我希望根据Ret的类型对成员方法进行专门化。
有人有点想法吗?
SFINAE不适用于非模板功能(成员或非成员)。
正如Kerrek SB指出的那样,使它们成为非成员函数模板将起作用。 或者正如Xeo指出的那样,使用带有默认模板参数的成员函数模板也可以工作。
但是,这只能起作用,因为两个std::enable_if
条件不重叠 。 如果你想为int
(比如说)添加一个不同的重载,那么你会发现它不能很好地扩展。 根据您的要求,标签调度通常比SFINAE更好地扩展,您可以使用多个备选方案进行调度:
#include<type_traits>
template<typename Ret>
class Foo
{
public:
void _on_dispatched()
{
// tag dispachting: create dummy of either std::false_type or std::true_type
// almost guaranteed to be optimized away by a decent compiler
helper_on_dispatched(std::is_void<Ret>());
}
private:
void helper_on_dispatched(std::false_type)
{
// do stuff for non-void
}
void helper_on_dispatched(std::true_type)
{
// do stuff for void
}
};
int main()
{
Foo<void>()._on_dispatched();
Foo<int>()._on_dispatched();
return 0;
}
SFINAE仅适用于模板。 您的代码可以通过一些小修改来编译:
template <typename Ret>
typename std::enable_if<std::is_void<Ret>::value, Ret>::type _on_dispatched() { /*...*/ }
template <typename Ret>
typename std::enable_if<!std::is_void<Ret>::value, Ret>::type _on_dispatched() { /*...*/ }
用法:
auto q = _on_dispatched<int>();
您当然不能推断函数的返回类型,因为它不可推导。 但是,您可以将此模板打包到另一个模板中:
template <typename T>
struct Foo
{
// insert templates here, maybe privately so
T bar() { return _on_dispatched<T>(); }
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.