我有以下无法编译的代码。 这是接受参数的模板类中的两个函数
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;
}
关于c++ - 模板方法 enable_if 特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12002447/