考虑这段代码
#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)
我怎样才能做到这一点?
您可以使用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)