微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c – 使用SFINAE禁用模板类成员函数

是否可以使用SFINAE和std :: enable_if来禁用模板类的单个成员函数

我目前有一个类似于此的代码

#include <type_traits>
#include <iostream>
#include <cassert>
#include <string>

class Base {
public:
    virtual int f() { return 0; }
};

template<typename T>
class Derived : public Base {
private:
    T getValue_() { return T(); }

public:
    int f() override {
        assert((std::is_same<T,int>::value));
        T val = getValue_();
        //return val; --> not possible if T not convertible to int
        return *reinterpret_cast<int*>(&val);
    }
};


template<typename T>
class MoreDerived : public Derived<T> {
public:
    int f() override { return 2; }
};


int main() {
    Derived<int> i;
    MoreDerived<std::string> f;
    std::cout << f.f() << " " << i.f() << std::endl;
}

理想情况下,如果T!= int,则应禁用Derived< T> :: f().因为f是虚拟的,所以Derived< T> :: f()会为Derived的任何实例化生成,即使它从未被调用过.
但是使用代码使得Derived< T> (使用T!= int)永远不会仅作为MoreDerived< T>的基类创建.

所以Derived< T> :: f()中的hack是编译程序所必需的; reinterpret_cast行永远不会被执行.

解决方法

你可以简单地将f专门化为int:
template<typename T>
class Derived : public Base {
private:
    T getValue_() { return T(); }

public:
    int f() override {
        return Base::f();
    }
};

template <>
int Derived<int>::f () {
    return getValue_();
}

原文地址:https://www.jb51.cc/c/111826.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐