模板方法enable_if专门化

use*_*257 6 c++ templates class enable-if c++11

我有以下不编译的代码.这是接受参数的模板类中的两个函数

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() {
    // ....
}
Run Code Online (Sandbox Code Playgroud)

我希望根据Ret的类型对成员方法进行专门化.

有人有点想法吗?

Tem*_*Rex 7

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;
}
Run Code Online (Sandbox Code Playgroud)