c++ - 类方法的 SFINAE

标签 c++ oop templates c++14 sfinae

文章https://www.fluentcpp.com/2018/05/15/make-sfinae-pretty-1-what-value-sfinae-brings-to-code/https://www.fluentcpp.com/2018/05/18/make-sfinae-pretty-2-hidden-beauty-sfinae/解释如何将 SFINAE 用于类方法。该类的第一个实现如下:

template<typename T>
class MyClass
{
public:
    void f(T const& x);
    void f(T&& x);
};

如果T是一个引用,为了防止使用第二个函数f,本文提出了以下解决方案:

template<typename T>
class MyClass
{
public:
    void f(T const&  x){}

    template<typename T_ = T, typename = std::enable_if_t<!std::is_reference_v<T_>>>
    void f(T&& x){}
};

将方法的返回类型替换为 std::enable_if 会不会更容易/更清晰?所以这个类看起来像下面这样:

template<typename T>
class MyClass
{
public:
    void f(T const&  x){}

    std::enable_if_t<!std::is_reference_v<T>>> f(T&& x){}
};

最佳答案

首先,你的技术不行。 TMyClass 中的固定类型enable_if_t<false>是病式的。没有执行替换,所以这不是替换失败,它只是一个格式错误的签名。

你可以在某种程度上修复它

template<class T_=T>
std::enable_if_t<!std::is_reference_v<T_>>> f(T_&& x){}

现在,这种技术(使用返回值)在 (A) 构造函数和 (B) 您想要推导返回类型时不起作用。

它还将返回类型与 SFINAE 代码混合;两者没有任何关系。

最重要的是,这项技术和您正在复制的原始技术都与“所有模板必须具有有效的实例化”存在一些可疑的交互。我仍然不清楚这是否适用于固定模板类实例化的每个模板方法;如果是这样,那么你必须确保一些 T_将使主体有效。

关于c++ - 类方法的 SFINAE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50648573/

相关文章:

c++ - 从 std::map 访问时,Eclipse CDT 无法解析结构函数

c++ - 为什么没有调用构造函数?

.net - jquery 类似 c#/.Net 中的扩展

oop - 如何为观察者系统创建这种接口(interface)?

java - 将单记录 csv 文件读入类字段的编程习惯

c++ - 运算符 [ ] 递归

c++ - Linux Posix 队列打开的文件太多

c++ - 函数模板

c++ - 在每次执行时设置模板代码的类型

c++ - setter 和 getter 的模板