c++ - 模板方法 enable_if 特化

标签 c++ class templates c++11 enable-if

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

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/

相关文章:

c++ - C++中关于常量初始化和零初始化的顺序的矛盾定义

c++ - 对非内联基类函数的内联调用(这到底是什么意思)?

c++ - map 对象在方法调用期间被复制

c# - 我可以访问内部类中的外部类对象吗

jquery - Underscore.js 模板循环来自对象迭代

c++ - 尝试提取不是结构的值的组成部分。 C++

c++ - 如何在没有setter的情况下设置类内部类的成员变量?

java - Android - 如何声明 'this' 的变量?

c++ - 在C++中使循环变量成为常量

c++ - 缩短 C++ 函数签名的标准方法