繁体   English   中英

模板方法enable_if专门化

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM