std::enable_if 和enable_if_t 搭配 is_same编译时期类型检查

class AT{
public:
    void PrintT(){
        std::cout << "PrintT" << std::endl;
    }

    int ati;
};

int main() {

    std::enable_if_t::value,AT> ati;  // 获取AT类 c++ 14
    //   或者
    // std::enable_if::value,AT>::type ati; // c++ 11
    ati.PrintT();
}

具体的使用enable_if 做模版函数的编译时期的判断:
https://blog.csdn.net/jeffasd/article/details/84667090
https://www.jianshu.com/p/a961c35910d2

模版实例化代码:

typename std::enable_if::type t; //正确
typename std::enable_if::type; //可以通过编译,没有实际用处,推导的模板是偏特化版本,第一模板参数是true,第二模板参数是通常版本中定义的默认类型即void
typename std::enable_if::type; //无法通过编译,type类型没有定义
typename std::enable_if::type t2; //同上

enable_if and is_same

class Object {
public:
    bool to_string() {
        return true;
    }
};

bool ChangeToString(Object* o) {
    return o->to_string();
}
#define DEF_IS(check_type, return_type) \
    template \
    typename std::enable_if::value, return_type>::type

// string
DEF_IS(std::string, bool) is_type(Object* obj) {
    return ChangeToString(obj);
}

你可能感兴趣的:(c++模版编程)