如何为某些特定数据类型重载运算符?

ava*_*msi 0 c++

考虑这段代码

#include <bits/stdc++.h>
using namespace std;

struct foo {
    template <typename T>
    foo& operator<< (const T& var) {
        cout << var;
        return *this;
    }
} bar;

int main() {
    bar << 1 << '\n';
    bar << 1.2 << '\n';
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我想<<只为整数数据类型重载运算符.(int16_t,int32_t,int64_t)
我怎样才能做到这一点?

Tar*_*ama 6

您可以使用SFINAE来确保它T是一个完整的类型:

template <typename T>
std::enable_if_t<std::is_integral<T>::value, foo&> 
operator<< (const T& var) {
    cout << var;
    return *this;
}
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用static_assert:

template <typename T>
foo& operator<< (const T& var) {
    static_assert(std::is_integral<T>::value, "T must be an integral type"); 
    cout << var;
    return *this;
}
Run Code Online (Sandbox Code Playgroud)

请注意,您应该 #include从任何bits文件夹中,这是不可移植.


如果要为积分和浮点类型分别进行重载,可以进行两次重载并使用SFINAE进行选择:

template <typename T>
std::enable_if_t<std::is_integral<T>::value, foo&>
operator<< (const T& var) {
    cout << "int " << var;
    return *this;
}

template <typename T>
std::enable_if_t<std::is_floating_point<T>::value, foo&>
operator<< (const T& var) {
    cout << "float " << var;
    return *this;
}
Run Code Online (Sandbox Code Playgroud)

当我们获得Concepts时,您将能够编写如下内容:

template <Integral T>
//        ^^^^^^^^ Integral rather than typename
foo& operator<< (const T& var) {
    cout << var;
    return *this;
}    
Run Code Online (Sandbox Code Playgroud)